home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 January / Chip_2003-01_cd1.bin / zkuste / delphi / kompon / d5 / MREGAPP.ZIP / mRegApp.pas < prev    next >
Pascal/Delphi Source File  |  2002-08-08  |  10KB  |  380 lines

  1. {
  2. ----------------------------------------------------------
  3. MAS-CompMaker was used to generate this code
  4. MAS-CompMaker, 2000-2002« Mats Asplund
  5. ----------------------------------------------------------
  6.  
  7. Component Name: TmRegApp
  8.         Author: Mats Asplund
  9.       Creation: 2002-08-03
  10.        Version: 1.0
  11.    Description: An application registration component.
  12.         Credit: Thanks to Oleg Petkov, http://olegpetkov.dir.bg/
  13.                 for providing the code/decode-routines.
  14.         E-mail: masprod@telia.com
  15.           Site: http://go.to/mdp
  16.   Legal issues: All rights reserved 2002« by Mats Asplund
  17.  
  18. Usage:
  19.   This software is provided 'as-is', without any express or
  20.   implied warranty.  In no event will the author be held liable
  21.   for any  damages arising from the use of this software.
  22.  
  23.   Permission is granted to anyone to use this software for any
  24.   purpose, including commercial applications, and to alter it
  25.   and redistribute it freely, subject to the following
  26.   restrictions:
  27.  
  28.   1. The origin of this software must not be misrepresented,
  29.      you must not claim that you wrote the original software.
  30.      If you use this software in a product, an acknowledgment
  31.      in the product documentation would be appreciated but is
  32.      not required.
  33.  
  34.   2. Altered source versions must be plainly marked as such, and
  35.      must not be misrepresented as being the original software.
  36.  
  37.   3. This notice may not be removed or altered from any source
  38.      distribution.
  39.  
  40.   4. If you decide to use this software in any of your applications.
  41.      Send me an EMail and tell me about it.
  42.  
  43. Quick Reference:
  44.   TmRegApp inherits from TComponent.
  45.  
  46.   Key-Properties:
  47.     P: The password. Automatically coded. Otherwise it could be read in the
  48.     resource part of the exe-file. Note! Set password at designtime. Otherwise
  49.     it will not work.
  50.  
  51.     CodeKey: Key used for coding/decoding. Change this to anything you like.
  52.  
  53.     DaysToUse: The number of days before registering is needed.
  54.  
  55.     FakeGUID: A false GUID used as key in Registry. You should change this,
  56.     otherwise others with knowledge of this component could find it.
  57.  
  58.   Key-Methods:
  59.     Init: Should be called each time the application starts executing. Returns
  60.           the days left before registrering is needed. If the app. is registered
  61.           -1 is returned.
  62.  
  63.     MoveBack: Read this to see if user has manipulated the clock. If true,
  64.               the user has moved the clock back more then one day compared with
  65.               the lastuse date. In this case 0 will be returned (and will
  66.               continue to do so until registered), when calling the Init function.
  67.  
  68.     ClearReg: Deletes all Registry-entries made.
  69.               (Deletes the FakeGUID-key from Registry.)
  70.  
  71.     CheckPassWord: Returns true if password is correct.
  72.                    If so the values: 'DaysToUse', 'Expire', 'LastUse' will be
  73.                    deleted from Registry. The value: 'Registered' will be set true.
  74.  
  75.     ExpireDate: Returns Expiredate as a string.
  76.  
  77.     InstallationDate: Returns Installationdate as a string.
  78.  
  79.     LastUseDate: Returns the date of last use as a string.
  80.  
  81.  
  82. --------------------------------------------------------------------------------
  83. }
  84. unit mRegApp;
  85.  
  86. interface
  87.  
  88. uses
  89.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  90.   Forms, Dialogs, StdCtrls, ExtCtrls;
  91.  
  92. type
  93.   TDType = (dtInstall, dtLastUse, dtExpire);
  94.  
  95.   TmRegApp = class(TComponent)
  96.   private
  97.     FAbout: string;
  98.     fP: string;
  99.     fCodeKey: string;
  100.     fDaysToUse: Integer;
  101.     fFakeGUID: string;
  102.     procedure SetCop(Value: string);
  103.     procedure SetP(const Value: string);
  104.     function Code(Text: string): shortstring;
  105.     function Decode(CodedText: string): shortstring;
  106.     function GetDates(DateType: TDType): string;
  107.   public
  108.     constructor Create(AOwner: TComponent); override;
  109.     destructor Destroy; override;
  110.     function Init: Integer;
  111.     function ExpireDate: string;
  112.     function InstallationDate: string;
  113.     function LastUseDate: string;
  114.     function MoveBack: boolean;
  115.     procedure ClearReg;
  116.     function CheckPassWord(PassWord: string):boolean;
  117.   published
  118.     property P: string read fP write SetP; // The password
  119.     property CodeKey: string read fCodeKey write fCodeKey;
  120.     property DaysToUse: Integer read fDaysToUse write fDaysToUse;
  121.     property FakeGUID: string read fFakeGUID write fFakeGUID;
  122.     property About: string read FAbout write SetCop;
  123.   end;
  124.  
  125. procedure Register;
  126.  
  127. const
  128.   RegKey = '\Software\CLASSES\CLSID\';
  129.  
  130. implementation
  131. uses DateUtils, Registry;
  132.  
  133. procedure Register;
  134. begin
  135.   RegisterComponents('MAs Prod.', [TmRegApp]);
  136. end;
  137.  
  138. constructor TmRegApp.Create(AOwner: TComponent);
  139. begin
  140.   inherited Create(AOwner);
  141.   fCodeKey:= 'MA-89D7-02';
  142.   fDaysToUse:= 31;
  143.   fFakeGUID:= '{A1159D67-71E0-11D4-BE52-39A481D50110}';
  144.   FAbout:= 'Version 1.0, 2002 « Mats Asplund, http://go.to/masdp';
  145. end;
  146.  
  147. destructor TmRegApp.Destroy;
  148. begin
  149.   inherited Destroy;
  150. end;
  151.  
  152. function TmRegApp.Init: Integer; //DaysLeft. -1 if registered
  153. var
  154.   Reg: TRegistry;
  155.   LastUse, ExpireDate: TDateTime;
  156. begin
  157.   Reg:= TRegistry.Create;
  158.   try
  159.     Reg.RootKey:= HKEY_LOCAL_MACHINE;
  160.     if Reg.KeyExists(RegKey + fFakeGUID) then
  161.     begin
  162.       Reg.OpenKey(RegKey + fFakeGUID, false);
  163.       if Reg.ReadBool(Code('Registered')) then
  164.         Result:= -1
  165.       else
  166.       begin
  167.         LastUse:= StrToDateTime(Decode(Reg.ReadString(Code('LastUse'))));
  168.         if (Reg.ReadBool(Code('MoveBack'))) or (CompareDate(Now, LastUse) < 0)
  169.           then
  170.         begin
  171.           Reg.WriteBool(Code('MoveBack'), true);
  172.           Result:= 0; // Time moved back
  173.           Exit;
  174.         end;
  175.         Reg.WriteString(Code('LastUse'), Code(DateTimeToStr(Now)));
  176.         ExpireDate:= StrToDateTime(Decode(Reg.ReadString(Code('Expire'))));
  177.         if CompareDate(ExpireDate, Now) > 0 then
  178.           Result:= DaysBetween(ExpireDate, Now)
  179.         else
  180.           Result:= 0; // Expired
  181.       end
  182.     end
  183.     else
  184.     begin // First time started
  185.       Reg.OpenKey(RegKey + fFakeGUID, true);
  186.       Reg.WriteString(Code('DaysToUse'), Code(IntToStr(fDaysToUse)));
  187.       Reg.WriteString(Code('Install'), Code(DateTimeToStr(Now)));
  188.       Reg.WriteString(Code('Expire'), Code(DateTimeToStr(IncDay(Now,
  189.         fDaysToUse))));
  190.       Reg.WriteString(Code('LastUse'), Code(DateTimeToStr(Now)));
  191.       Reg.WriteBool(Code('MoveBack'), false);
  192.       Reg.WriteBool(Code('Registered'), false);
  193.       Reg.CloseKey;
  194.       Result:= fDaysToUse;
  195.     end;
  196.   finally
  197.     Reg.Free;
  198.   end;
  199. end;
  200.  
  201. procedure TmRegApp.ClearReg;
  202. var
  203.   Reg: TRegistry;
  204. begin
  205.   Reg:= TRegistry.Create;
  206.   try
  207.     Reg.RootKey:= HKEY_LOCAL_MACHINE;
  208.     if Reg.KeyExists(RegKey + fFakeGUID) then
  209.       Reg.DeleteKey(RegKey + fFakeGUID);
  210.   finally
  211.     Reg.Free;
  212.   end;
  213. end;
  214.  
  215. function TmRegApp.LastUseDate: string;
  216. begin
  217.   Result:= GetDates(dtLastUse);
  218. end;
  219.  
  220. function TmRegApp.ExpireDate: string;
  221. begin
  222.   Result:= GetDates(dtExpire);
  223. end;
  224.  
  225. function TmRegApp.InstallationDate: string;
  226. begin
  227.   Result:= GetDates(dtInstall);
  228. end;
  229.  
  230. function TmRegApp.MoveBack: boolean;
  231. var
  232.   Reg: TRegistry;
  233. begin
  234.   Result:= false;
  235.   Reg:= TRegistry.Create;
  236.   try
  237.     Reg.RootKey:= HKEY_LOCAL_MACHINE;
  238.     if Reg.KeyExists(RegKey + fFakeGUID) then
  239.     begin
  240.       Reg.OpenKey(RegKey + fFakeGUID, false);
  241.       Result:= Reg.ReadBool(Code('MoveBack'));
  242.     end;
  243.   finally
  244.     Reg.Free;
  245.   end;
  246. end;
  247.  
  248. function TmRegApp.CheckPassWord(PassWord: string): boolean;
  249. var
  250.   Reg: TRegistry;
  251. begin
  252.   Reg:= TRegistry.Create;
  253.   try
  254.   Result:= false;
  255.   if PassWord = Decode(fP) then
  256.   begin
  257.     Reg.RootKey:= HKEY_LOCAL_MACHINE;
  258.     if Reg.KeyExists(RegKey + fFakeGUID) then
  259.     begin
  260.       Reg.OpenKey(RegKey + fFakeGUID, false);
  261.       Reg.WriteBool(Code('Registered'), true);
  262.       Reg.DeleteValue(Code('DaysToUse'));
  263.       Reg.DeleteValue(Code('Expire'));
  264.       Reg.DeleteValue(Code('LastUse'));
  265.       Result:= true;
  266.     end;
  267.   end
  268.   else
  269.     Result:= false;
  270.   finally
  271.     Reg.Free;
  272.   end;
  273. end;
  274.  
  275. procedure TmRegApp.SetCop(Value: string);
  276. begin
  277.   Exit;
  278. end;
  279.  
  280. procedure TmRegApp.SetP(const Value: string);
  281. begin
  282.   fP:= Value;
  283.   if csDesigning in ComponentState then // Could only be set at designtime
  284.   begin
  285.     Showmessage('Password "' + fP + '" is coded to: ' + Code(fP));
  286.     fP:= Code(fP);
  287.   end;
  288. end;
  289.  
  290. function TmRegApp.GetDates(DateType: TDType): string;
  291. var
  292.   Reg: TRegistry;
  293.   DT: string;
  294. begin
  295.   Reg:= TRegistry.Create;
  296.   try
  297.     Result:= '';
  298.     case DateType of
  299.       dtInstall: DT:= 'Install';
  300.       dtLastUse: DT:= 'LastUse';
  301.       dtExpire: DT:= 'Expire';
  302.     end;
  303.     Reg.RootKey:= HKEY_LOCAL_MACHINE;
  304.     if Reg.KeyExists(RegKey + fFakeGUID) then
  305.     begin
  306.       Reg.OpenKey(RegKey + fFakeGUID, false);
  307.       Result:= Decode(Reg.ReadString(Code(DT)));
  308.     end;
  309.   finally
  310.     Reg.Free;
  311.   end;
  312. end;
  313.  
  314. function TmRegApp.Decode(CodedText: string): shortstring;
  315. var
  316.   DataSize, q, Q1, k, Len: short;
  317.   P: PChar;
  318.  
  319.   function HexaToInt(ch: char): short;
  320.   begin
  321.     case ch of
  322.       '0'..'9': Result:= StrToInt(ch);
  323.       'A': Result:= 10;
  324.       'B': Result:= 11;
  325.       'C': Result:= 12;
  326.       'D': Result:= 13;
  327.       'E': Result:= 14;
  328.       'F': Result:= 15;
  329.     else
  330.       Result:= 7;
  331.     end;
  332.   end;
  333. begin
  334.   Result:= '';
  335.   k:= 1;
  336.   P:= PChar(CodedText);
  337.   DataSize:= Length(CodedText);
  338.   Len:= Length(fCodeKey);
  339.   if Len > DataSize then
  340.     Len:= DataSize;
  341.   while DataSize > 0 do
  342.   begin
  343.     case P^ of
  344.       #10, #13, #32: Inc(P);
  345.     else
  346.       Q1:= HexaToInt(P^);
  347.       Inc(P);
  348.       q:= HexaToInt(P^);
  349.       Inc(P);
  350.       q:= (Q1 * 16) + q;
  351.       q:= q xor (Ord(fCodeKey[k]));
  352.       Inc(k);
  353.       if k > Len then
  354.         k:= 1;
  355.       Result:= Result + chr(q);
  356.     end;
  357.     Dec(DataSize, 2);
  358.   end;
  359. end;
  360.  
  361. function TmRegApp.Code(Text: string): shortstring;
  362. var
  363.   DataSize, i, q, k: short;
  364. begin
  365.   Result:= '';
  366.   DataSize:= Length(Text);
  367.   k:= 1;
  368.   for i:= 1 to DataSize do
  369.   begin
  370.     q:= Ord(Text[i]) xor Ord(fCodeKey[k]);
  371.     Inc(k);
  372.     if k > Length(fCodeKey) then
  373.       k:= 1;
  374.     Result:= Result + IntToHex(q, 2);
  375.   end;
  376. end;
  377.  
  378. end.
  379.  
  380.