Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rave Datei für Anwender Sperren/Schützen (https://www.delphipraxis.net/129720-rave-datei-fuer-anwender-sperren-schuetzen.html)

TUX_der_Pinguin 24. Feb 2009 14:07


Rave Datei für Anwender Sperren/Schützen
 
Bei meiner Anwendung soll ein Report mitgeliefert werden in Form einer *.rav Datei jedoch würde ich gern
verhindern das der Anwender falls er die Rave IDE hat die Datei zu bearbeiten.

Naja eine möglichkeit wäre das umbennenen der Dateierweiterung aber das wäre etwas zu simpel, die Report
Datei mit in die Exe zupacken würde ich eher ungern machen, daher die Fragen was für möglichkeiten es
da gibt.

Vielleicht ist es ja möglich die Datei in eine DLL zupacken und diese dann bei bedarf in den Speicher zu laden.

Die Anwendung ist mit Delphi 2007 Prof. R2 für Win32 erstellt worden und die Report Datei mit der begelieferten
Rave Report Version.

mkinzler 24. Feb 2009 14:09

Re: Rave Datei für Anwender Sperren/Schützen
 
MNan könnte die Datei verschlüsseln oder aus einer Datenbank laden

TUX_der_Pinguin 24. Feb 2009 14:14

Re: Rave Datei für Anwender Sperren/Schützen
 
Zitat:

Zitat von mkinzler
MNan könnte die Datei verschlüsseln oder aus einer Datenbank laden

Naja aus einer Datenbank laden ist eher nicht möglich, da kein Datenbank System vorhanden ist an der Stelle.
Die Überlegung die Datei per FileStream in eine eigene Binärdatei zu laden um diese dann später wiederherzustellen
kam mir auch schon, nur wollte ich mal die Experten Fragen man muß das Rad ja nicht ständig neu erfinden, hatte auf
eine "Fertige" Lösung gehofft.

mkinzler 24. Feb 2009 14:15

Re: Rave Datei für Anwender Sperren/Schützen
 
Verschlüsseltes Archiv, Filecontainer, ...

TUX_der_Pinguin 2. Mär 2009 14:41

Re: Rave Datei für Anwender Sperren/Schützen
 
So ich habe endlich etwas Zeit gefunden, um mich wieder um die Frage zu kümmern wie ich eine 'Rave' Datei schützen kann.

Ich habe folgendes auf die schnelle zusammen geschrieben, soweit funktioniert alles. Ich kann eine Datei packen und diese
dann auch wieder entpacken, anschließend ergab ein Dateivergleich mit Total Commander das die Dateien identisch sind.

Was ich mich jetzt noch frage ist, ob es noch groß was an dem code auszusetzten gibt oder gar grobe schnitzer drin sind.

Morgen schau ich dann noch das ich eine simple Verschlüsselung zusammen gebastelt bekomme, damit man nix mehr erkennen kann
falls jemand die Datei mit dem Editor öffnet.

Später soll dann die Rave Datei gepackt werden und wird mit dem Installer der Anwendung ausgeliefert,
in der Anwendung wird die Datei on-the-fly entpackt und kann dann entsprechend gedruckt werden oder
was sonst mit dem Report passieren soll.


Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MD5;


type
  tPackFile = record
    Version  : Byte;
    Password : String[32];
    Size     : Integer;
    Package  : array of Byte;
  end;


type
  TForm1 = class(TForm)
    btnOpen: TButton;
    OpenDialog: TOpenDialog;
    edtFile: TEdit;
    btnCompress: TButton;
    SaveDialog: TSaveDialog;
    btnDecompress: TButton;
    procedure btnOpenClick(Sender: TObject);
    procedure btnCompressClick(Sender: TObject);
    procedure btnDecompressClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    NewFile : tPackFile;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnOpenClick(Sender: TObject);
begin
  //Welche Datei soll gepackt werden?
  if OpenDialog.Execute then edtFile.Text := OpenDialog.FileName;
end;


procedure TForm1.btnCompressClick(Sender: TObject);
var
  FStream : TFileStream;
  FHandle : file of byte;
  cTmp   : byte;
  ByteIdx : Integer;

begin
  if SaveDialog.Execute then begin
    //init
    NewFile.Version := 1;
    NewFile.Password := MD5Print(MD5File(OpenDialog.FileName));
    SetLength(NewFile.Package, 1000000);
    ByteIdx := 0;

    //Datei die gepackt werden soll, öffnen und einlesen...
    System.Assign(FHandle, edtFile.Text);
    {$I-}
    Reset(FHandle);
    {$I+}
    if IoResult = 0 then begin
      while not Eof(FHandle) do begin
        //Zeichen lesen
        Read(FHandle, cTmp);

        NewFile.Package[ByteIdx] := cTmp;
        Inc(ByteIdx);
      end;{while}

      System.Close(FHandle);
    end;

    //Größe der Datei
    SetLength(NewFile.Package, ByteIdx);
    NewFile.Size := Length(NewFile.Package);


    //Datei speichern...
    FStream := TFileStream.Create(SaveDialog.FileName, fmCreate or fmShareExclusive);
    try
      FStream.WriteBuffer(NewFile.Version, SizeOf(NewFile.Version));
      FStream.WriteBuffer(NewFile.Password, SizeOf(NewFile.Password));
      FStream.WriteBuffer(NewFile.Size, SizeOf(NewFile.Size));

      for ByteIdx := 0 to High(NewFile.Package) do begin
        FStream.WriteBuffer(NewFile.Package[ByteIdx], SizeOf(NewFile.Package[ByteIdx]));
      end;{for}

    finally
      FStream.Free;
    end;

  end;{if}

end;


procedure TForm1.btnDecompressClick(Sender: TObject);
var
  FStream : TFileStream;
  Index  : Integer;
  FHandle : file of byte;

begin
  if SaveDialog.Execute then begin
    //init
    NewFile.Version := 0;
    NewFile.Password := '';
    NewFile.Size    := 0;
    NewFile.Package := nil;

    //Datei öffnen und einlesen...
    FStream := TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareExclusive);
    try
      FStream.ReadBuffer(NewFile.Version, SizeOf(NewFile.Version));
      FStream.ReadBuffer(NewFile.Password, SizeOf(NewFile.Password));

      if NewFile.Password = '3b2e0b0079c60f165ce92eb0bce18b5d' then begin
        FStream.ReadBuffer(NewFile.Size, SizeOf(NewFile.Size));
        SetLength(NewFile.Package, NewFile.Size);
        for Index := 0 to NewFile.Size-1 do begin
          FStream.ReadBuffer(NewFile.Package[Index], SizeOf(NewFile.Package[Index]));
        end;{for}
      end
      else
        ShowMessage('File damaged');

      //Datei erstellen...
      System.Assign(FHandle, SaveDialog.FileName);
      {$I-}
      Rewrite(FHandle);
      {$I+}
      if IoResult = 0 then begin
        for Index := 0 to High(NewFile.Package) do begin
          Write(FHandle, NewFile.Package[Index]);
        end;
        System.Close(FHandle);
      end;{if}

    finally
      FStream.Free;
    end;

  end;{if SaveDialog}


end;


end.

Keldorn 2. Mär 2009 18:45

Re: Rave Datei für Anwender Sperren/Schützen
 
Hallo

darf man fragen, warum Du den Aufwand betreiben willst?
Ich meine, das ein Anwender, der nicht programmiert, den Rave-Designer hat, ist ja wohl ziemlich ausgeschlossen ;-).

Wast hast Du denn so für geheimnisvolle Daten in der Vorlage selbst? Was spricht jetzt wirklich dagegen, den Report mit in der Exe zu integrieren?

Im Ravedesigner gibt es noch ein Adminpassword als eigenschaft, ich weiß allerdings nicht, für was die da ist, beschrieben ist sie nicht.
Kannst du nur mal merlin17 fragen.
Gruß Frank

TUX_der_Pinguin 3. Mär 2009 07:14

Re: Rave Datei für Anwender Sperren/Schützen
 
Zitat:

Zitat von Keldorn
Hallo

darf man fragen, warum Du den Aufwand betreiben willst?
Ich meine, das ein Anwender, der nicht programmiert, den Rave-Designer hat, ist ja wohl ziemlich ausgeschlossen ;-).

Wast hast Du denn so für geheimnisvolle Daten in der Vorlage selbst? Was spricht jetzt wirklich dagegen, den Report mit in der Exe zu integrieren?

Im Ravedesigner gibt es noch ein Adminpassword als eigenschaft, ich weiß allerdings nicht, für was die da ist, beschrieben ist sie nicht.
Kannst du nur mal merlin17 fragen.
Gruß Frank

Mir ist schon klar das die Wahrscheinlichkeit gering bis null ist das die Anwender einen Rave-Designer zur hand haben.

Geheimnisvoll sind die Daten auch nicht wirklich da der Anwender diese ja Drucken bzw. als PDF exportieren kann, es geht
mir eher darum das ein neugieriger nicht die Daten verändern kann.

Mit in die Exe zu kompilieren will ich nicht, da dies die Exe noch mehr vergrößert und der Report auch nicht immer der Software
bei liegt, da es sich nur um ein Programm Modul handelt was diesen Report nutzt.

Ach ja und als letztes Argument warum ich diesen Aufwand betreibe ist es meine eigene Neugierde zu befriedigen und um sowas
mal gemacht zu haben, sprich Lern Effekt. Wer weiß vielleicht kann man das auch für das ein oder andere auch benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz