AV-SOFT
AVLock SIMPLE
Introducción
Que es AVLock SIMPLE?
Como adquirir AVLock SIMPLE?
Nuevo en v5.1
Usando AVLock SIMPLE
Como instalar AVLock SIMPLE?
Conceptos Básicos
Configuración
Usuarios e Instancias
Esquemas de protección
Ejemplos
Nuevo Estilo
Ejemplo 1
Ejemplo 2
Ejemplo 3
Ejemplo 4
Ejemplo 5
Request Key
UserData Based
Ejemplos PayPal IPN
Propiedades
Métodos
El Online License Manager (OLM)
Como's
La utilidad Configurator
La utilidad RegMonitor
La Utilidad KeyGen
La Utilidad CodeCheck
La Utilidad KeyCheck
Información adicional
Acuerdo de licencia
Historia de versiones_2

Ejemplo 1

Top  Previous  Next

 

Items

En este ejemplo aprenderá a

Las versiones de este ejemplo

Esquemas de protección

Diagrama de flujo y formulario principal

El formulario de registración

Obtener el estado de registración

Ingresar datos personales del usuario

Iniciar periodo trial

Registrar la aplicación

Controlar el número de instancias simultáneas

Breve práctica con el ejemplo 1a

Borrar la registración existente

Registrar aplicación utilizando claves

Sincronizar los datos y renovar la registración desde el OLM

Controlar la fecha del computador

El ejemplo 1b

 

 

En este ejemplo aprenderá a:

1. Utilizar el componente AVLock SIMPLE en un esquema básico de protección (esquema A).

2. Controlar el número de instancias simultáneas.

3. Utilizar dos métodos distintos para iniciar el periodo trial: Fuera de línea y en línea utilizando el OLM básico.

4. Verificar y corregir automáticamente la fecha de su computador.

5. Remover los datos de registración locales y en el servidor (OLM).

6. Utilizar la utilidad KeyGen para generar claves de registración.

 

Las versiones de este ejemplo

La versión (1a) es la versión de desarrollo donde se agregaron botones utilitarios para iniciar el periodo trial y para borrar los datos de registración a fin de tener nuevamente la  aplicación en estado original.

La versión (1b) es la versión definitiva donde el periodo trial se inicia automáticamente y se retiraron los botones utilitarios.

 

En los ejemplos 1a y 1b se muestran todas las posibilidades de configuración, para el OLM avanzado, el OLM básico y sin el OLM en una sola implementación. Tal vez puede parecer algo confuso tener todas las opciones a la vez, por eso se agregaron los ejemplos "advancedolm", "basicolm" y "noolm" donde se muestran estas implementaciones por separado.

 

examples1

 

 

Esquema de protección

Este ejemplo utiliza el esquema A

 

Esquema A

layout01

 

Y lo implementa como se muestra en el siguiente diagrama de flujo:

 

 

 

Diagrama de flujo

 

demo01a03

Formulario principal (unit1)

 

 

example01mainform

 

El código fuente de Form1

 

procedure TForm1.FormCreate(Sender: TObject);

begin

 DoRegister(False);

 if (keydata.TooManyInstances) then begin

   showmessage('Too many instances');

   application.Terminate;

 end;

 if not AVLock.IsLocal and (AVLockS51.activeinstances.count < 2) then begin

   showmessage('This application must be run first from the server.');

   application.Terminate;

 end;

end;

 

procedure TForm1.DoRegister(force:boolean);

var F : TRegForm;

begin

 F:=TRegForm.Create(nil); //Create the registration Form

 try

   if AVLock.IsLocal and (force or (keydata.DaysLeft < 15)) then F.ShowModal;

 finally

   FreeAndNil(F);

 end;

 if (keydata.Status <> Registered) then begin

   showmessage('Not Registered');

   application.Terminate;

 end;

end;

 

 

El parámetro boolean "force" en el procedimiento DoRegister determina el comportamiento del procedimiento:

 

procedure TForm1.DoRegister(force:boolean);

 

Además considere la siguiente línea:

 

if force or (F.keydata.DaysLeft < 15) then F.ShowModal;

 

Al ejecutar el procedimiento:

1) Cuando (force=true): el formulario de registración se muestra siempre.

2) Cuando (force=false) solo se muestra si los dias faltantes para expirar son menores de 15.

  Veamos que pasa bajo distintas circunstancias;

  a) Con estado no registrado: el formulario de registración se muestra porque (daysleft = 0).

  b) Con estado registrado trial o temporal:

     - cuando los días restantes sean mayores o igual a 15 el formulario no se muestra (daysleft >= 15).

     - cuando los días restantes sean menores de 15 el formulario se muestra (daysleft < 15).

  c) Con estado registrado permanente: el formulario no se muestra al ser daysleft mayor que 15 (daysleft = 65535).

   

Desde FormCreate se ejecuta con (force=false) DoRegister(False); para que el formulario no se muestre cuando no es necesario porque la aplicación ya está registrada o queda mucho tiempo para expirar el periodo autorizado, pero desde el botón [Registration Form] se ejecuta con (force=true) DoRegister(True); para forzar a que el formulario se muestre siempre sin importar el estado de registración.

 

El Formulario de registración (RegForm)

 

example01regform

 

Este formulario, que llamamos "Formulario de Registración" nos permite separar del resto de la aplicación las funciones relacionadas con el componente AVLock SIMPLE. Desde aquí realizamos varias funciones, a saber:

 

1. Obtener el estado de registración.

2. Permitir al usuario ingresar sus datos personales y guardarlos en la base de datos del OLM y localmente.

3. Iniciar el periodo de evaluación (trial)

4. Registrar la aplicación.

 

Obtener el estado de registración

 

Lo primero que se hace en esta unidad es definir dos directivos al compilador que permitirán configurar la aplicación:

 

{$DEFINE SAN} //Options are NAS, SAN, REMOV

             // NAS = Network Attached Storage

             // SAN = Storage Area Network

             // REMOV = Removable Disk

 

{$DEFINE ADVANCED_OLM} //Options are BASIC_OLM, ADVANCED_OLM, NO_OLM

 

El método GetRegStatus de la unidad Regist permite obtener el estado actual de registración del componente. Abajo puede ver su código fuente.  Primero se asignan las propiedades del componente de acuerdo a los directivos definidos, las propiedades tienen valores por omisión preestablecidos (puede verlos en una tabla abajo. Solo sería necesario asignar los valores que no coinciden con los preestablecidos, en nuestro caso asignamos todas las propiedades pero Ud. podría asignar solo las necesarias en sus aplicaciones.

 

Se utiliza el método GetKeyData de AVLock para leer los datos de registración locales y asignarlos al registro 'keydata' de tipo TKeyData  definido en las sección "interface" de la unidad unit1.

Después se asigna el cuadro de edición EdIcode con el Installcode obtenido de la máquina y seguidamente en una estructura case se prepara el mensaje del estado de registración a mostrarse en la parte superior del formulario de registración y se lo asigna al caption del label lstatus.

 

Este método GetRegStatus es llamado con el evento OnCreate y al final de cada sección de código que haga cambios en el estado de registración, como ser en BtnRegClick(), BtnRemoveClick(), BtnTrialClick() y BtnTrialOlmClick().

 

 

procedure TRegForm.GetRegStatus;

var s:string;

begin

 with Form1 do begin

   AVLock.InstallCodeSources := Machine_Data;

   AVLock.MachineSources := [System_UUID, BaseBoard_SN, Reg_File];

  {$IFDEF NAS}

      AVLock.RegPath := CommonDocuments;

      AVLock.RegFolder := 'example1';

      AVLock.InstancesCtrl := False;

  {$ENDIF}

 

   {$IFDEF SAN}

      AVLock.RegPath := ExeDir;

      AVLock.RegFolder := '';

      AVLock.InstancesCtrl := True;

 {$ENDIF}

 

   {$IFDEF REMOV}

      AVLock.RegPath := ExeDir;

      AVLock.RegFolder := '';

      AVLock.InstancesCtrl := False;

      AVLock.RemovableDisk := True;

  {$ENDIF}

 

   AVLock.EncryptionKey := 'abc123';

   AVLock.EncryptionKey2 := 'xyz321';

   AVLock.AppID := 12301;

   AVLock.AppName := 'MyApp';

   AVLock.AppVersion := '1.0.0';

   AVLock.WebHost := 'www.av-soft.com';

   AVLock.TimeHost:= 'time-a.nist.gov';

   AVLock.OlmPath := '/olm5';

   AVLock.OlmBasicScript := 'basicolm.php';

   AVLock.OlmAdvScript := 'advancedolm.php';

   AVLock.GetKeyData(0,keydata);

   EdIcode.Text := AVLock.InstallCode;

   EdName.Text := AVLock.UserName;

   EdCompany.Text := AVLock.Company;

   EdEmail.Text := AVLock.Email;

   EdOther.Text := AVLock.OtherCode;

   s:='';

   case keydata.Status of

     Unregistered: s:='Not registered';

     Moved       : s:='Moved to another computer';

     Expired     : s:='Expired';

     Registered  : begin

       s:='';

       case keydata.KeyType of

         Trial     : s:=s+'Trial '+inttostr(keydata.Days)+' days - '+inttostr(keydata.DaysLeft)+' days left.';

         Temporal  : s:=s+'Temporal '+inttostr(keydata.Days)+' days - '+inttostr(keydata.DaysLeft)+' days left.';

         Permanent : s:=s+'Permanent, no time limit.';

       end;

     end;

   end;

 end;

 lstatus.caption:=s;

end;

 

procedure TRegForm.FormCreate(Sender: TObject);

begin

 GetRegStatus;

 testfields0:=testfields;

 Changed:=False;

end;

 

En el evento OnCreate se hace una llamada a GetRegStatus para obtener el estado de registración y además  obtenemos el valor para testfields0 que es un numero entre 0 y 4 que representa el avance en la carga de los datos del usuario, por ejemplo si testfields0 es 4 indica que no hay ningún dato ingresado y si es 0 todos los datos han sido ingresados. Este valor se obtiene con testfields y después se lo compara con el valor actual para determinar junto con la variable Changed si se ha avanzado en el ingreso de datos del usuario y es necesario guardarlos. En el siguiente tópico verá más detalles sobre este asunto.

 

Permitir al usuario ingresar sus datos personales y guardarlos en la base de datos del OLM y localmente.

 

En este formulario a través de varios cuadros de edición permitimos al usuario ingresar los siguientes datos personales: Nombre del Usuario, Compañía, Dirección de Email y Dirección Postal.  El objetivo es lograr que el usuario ingrese sus datos sin forzarlo a hacerlo, por lo tanto, el periodo trial se inicia sin requerirlo, después cada vez que se abandona el formulario de registración con el botón [Continue >>], si aún no ingresó todos los datos se le sugiere que permanezca sin salir y se tome unos momentos para llenar los datos y cada vez que se agregan datos estos se van guardando. Pero finalmente para realizar la registración debe tener todos sus datos ingresados. El código para esta funcionalidad es el siguiente:

 

 

function TRegForm.testfields:integer;

begin

 if (trim(edname.Text)='') then result:=4

 else if (trim(edcompany.Text)='') then result:=3

 else if (trim(edemail.Text)='') then result:=2

 else if (trim(edother.Text)='') then result:=1

 else result:=0;

end;

 

//Este código se utiliza para "NO_OLM y "BASIC_OLM" para guardar los datos localmente

//Para "ADVANCED_OLM" se utiliza OnlineSaveUserData que guarda los datos en el OLM y

//localmente

procedure TRegForm.writeData;

begin

 with Form1 do begin

   AVLock.UserName := EdName.Text;

   AVLock.Company  := EdCompany.Text;

   AVLock.Email := EdEmail.Text;

   AVLock.OtherCode := EdOther.Text;

   AVLock.WriteAppData; //write user data into the registration data

   AVLock.restart;

 end;

end;

 

procedure TRegForm.BtnContinueClick(Sender: TObject);

var n:integer;

begin

 n:=testfields;

 if (n<>0) then begin

   if (messagedlg('Please click Ok and take a few moments to fill out your user data.', mtConfirmation, [mbOk, mbIgnore], 0) = mrOk)

   then exit;

 end;

 if (n<=testfields0) and changed then begin

  {$IFDEF ADVANCED_OLM}

    Form1.AVLock.OnlineSaveUserData(edname.Text, edcompany.Text, edemail.Text, edother.Text,0);

   {$ELSE}

    writedata;

   {$ENDIF}

  end;  

  modalresult:=mrOk;

end;

 

Iniciar el periodo de evaluación (Trial).

 

En el ejemplo 1a el periodo trial se inicia manualmente con el botón [Start Trial] en el área de utilidades del desarrollador, con el siguiente código:

 

procedure TRegForm.BtnTrialClick(Sender: TObject);

begin

 if starttrial then showmessage('Trial started or synchronized successfully.')

 else showmessage('Failed to start the trial period.');

end;

 

function TRegForm.StartTrial:boolean;

var res:string;

   err:integer;

begin

 res:='00';

 {$IFDEF NO_OLM}

                //(index,users,inst,startdate,days,values)

   err:=Form1.AVLock.MakeTrial(0,1,2,date,30,'000');

   if (err=0) then res:='00';

 {$ENDIF}

 

 {$IFDEF BASIC_OLM}

                //values, kind, Index, days, inst)

   res := Form1.AVLock.OnlineGetKeyB('000',0,0,30,1);

 

 {$ENDIF}

 

 {$IFDEF ADVANCED_OLM}

   if (keydata.Status = Unregistered) then begin

     res := Form1.AVLock.OnlineSynch(0);

     if (res='00') then GetRegStatus;

     if (keydata.Status = Unregistered)

     then                 //(index,users,inst,days,values)

       res := Form1.AVLock.OnlineStartTrial(0,1,1,30,'000');

   end else res:='00';

 {$ENDIF}

 result:= (res='00');

 if result then GetRegStatus;

end;

 

En la versión 1b se lo inicia en forma automática insertando el llamado a StartTrial en el evento OnCreate.

 

procedure TRegForm.FormCreate(Sender: TObject);

begin

. . .

 StartTrial;

. . .

end;

 

Tenemos tres alternativas para iniciar el periodo trial:

a) Método fuera de línea. Utilizando el método MakeTrial().

b) Método en línea. Utilizando el OLM básico. El ejemplo está configurado para acceder al script basicolm.php del sitio www.av-soft.com que podrá utilizar para hacer las prácticas.

c) Método en línea. Utilizando el OLM avanzado. El ejemplo está configurado para acceder al script advancedolm.php del sitio www.av-soft.com que podrá utilizar para hacer las prácticas.

 

 

Registrar la Aplicación

 

En el formulario de registración podemos ver la sección "Register Now" con dos botones y un TEdit que permiten introducir la clave de registración y activarla con el botón [Register]. El primer botón de la izquierda [Load from file] permite introducir la clave desde un fichero. El código asociado al botón [Register] es el siguiente:

 

procedure TRegForm.BtnRegClick(Sender: TObject);

var s: string;

   err, n :integer;

   olm :boolean;

begin

 n:=testfields;

 if (n>0) then begin

   showmessage('Please fill out your user data then try again.');

   exit;

 end;

 olm:=False;

 s:='';

{$IFDEF ADVANCED_OLM}

   olm:= connected;

 {$ENDIF}

 if olm then begin

  //Save Uuser data into the OLM and locally

   Form1.AVLock.OnlineSaveUserData(edname.Text, edcompany.Text, edemail.Text, edother.Text,0);

  //register KEY into the OLM and locally

   s:=Form1.AVLock.OnlineRegisterKey(trim(EdKey.Text));

   if (s='00') then begin

     showmessage('Key registered successfully');

     GetRegStatus;

   end else showmessage('Process fail, error: '+s);

 end else begin

  //Save Uuser data locally    

   writedata;

  //register KEY locally

   err := Form1.AVLock.RegisterKey(trim(EdKey.Text));

   case err of

   0: s:= 'Key registered successfully';

   1: s:= 'Key Length mismatch';

   2: s:= 'Your system date is incorrect';

   3: s:= 'Key unregistered';

   4: s:= 'Key not valid';

   end;

   if (err=0) then GetRegStatus;

   if (s<>'') then showmessage(s);

 end;

end;

 

 

Controlar el número de instancias concurrentes

El campo Instances determina el número de instancias simultáneas permitidas en el computador. Para permitirlo debe asignar (InstancesControl=True). Opcionalmente podrá manejar las instancias dentro de una red asignando (RegFolder='') y (RegPath=Other), de esta manera los ficheros *.avr que guardan los datos de registración y el fichero *.avc que permiten controlar el número de instancias concurrentes se guardarán en la misma carpeta de la aplicación. Recuerde que Windows Vista no permite escribir bajo la carpeta "Archivos de programa", por lo tanto probablemente deberá utilizar otra carpeta para instalar su aplicación. Cuando el número de instancias sobrepasa el número permitido, el campo TooManyInstances se hace igual a True.

Este ejemplo tiene el botón [Instances running] en el formulario principal. Este llama al siguiente código:
 

procedure TForm1.BtnUsersClick(Sender: TObject);

var s:string;

   i:integer;

begin

 AVLock.Refresh;

 s:='There are active '+inttostr(AVLock.activeinstances.count)+' of '+

 inttostr(keydata.Instances)+' Instances allowed'+#13#10

 +'----------------------------------------------------------'+#13#10;

 for i:=0 to AVLock.activeinstances.count -1

 do s:=s+AVLock.activeinstances[i]+#13#10;

   s:=s+'----------------------------------------------------------';

 showmessage(s);

end;

 

Allí verá información sobre las instancias que se están ejecutando en ese momento. También considere el siguiente código desde el evento OnPaint:

 

Este código termina la aplicación si no está registrada.

 

 if (keydata.Status <> Registered) then begin

   showmessage('Not Registered');

   application.Terminate;

 end;

 

Este código termina la aplicación si se sobrepasa el número de instancias permitidas.

 

 if (keydata.TooManyInstances) then begin

   showmessage('Too many instances');

   application.Terminate;

 end;

 

Este código termina la aplicación si se intenta iniciar la primer instancia desde una terminal. Esta limitación se establece por razones de seguridad. Tema relacionado: Problema de seguridad.

 

 if not AVLock.IsLocal and (AVLock.activeinstances.count < 2) then begin

   showmessage('This application must be run first from the server.');

   application.Terminate;

 end;

 

 

 

Breve práctica con el ejemplo 1a

 

Desde el IDE de Delphi abra el ejemplo 1a (\Examples\1\a)

 

demo01a04

 

Ejecutar la aplicación

Presione el botón runbutton o F9 para iniciar la ejecución del programa.  En unos instantes podrá ver el formulario de registración:

 

demo01a05

 

Note que el estado corriente de registración es "Not registered" (No registrado). Esto es debido a que se ejecutó por primera vez el programa y en las versiones (a) de desarrollo no se inicia automáticamente el periodo trial.

 

Si el estado es no registrado, al hacer click sobre el botón [Continue >>] la aplicación terminará de ejecutarse y no podrá acceder al formulario principal "MAIN FORM".

 

 

Iniciar el periodo trial

 

Item relacionado: El proceso de registración

 

Por ahora veremos como hacerlo en forma manual utilizando los botones provistos para este efecto, después en la versión (b) veremos como hacerlo en forma automática al iniciar la aplicación.

Haga click sobre el botón [Start Trial ]. El código asociado a este botón ya se vió en el apartado Iniciar periodo de evaluación (trial).

 

Cambiando el siguiente directivo al compilador

{$DEFINE ADVANCED_OLM} //Options are BASIC_OLM, ADVANCED_OLM, NO_OLM

podrá probar las tres opciones. Le sugerimos que antes de intentar con un nuevo directivo elimine los datos de registración existentes con el botón [Remove Registration]

 

Después de presionar el botón [Start Trial] recibirá el mensaje  "Trial Started or synchronized successfully".

 

Si Ud. configura su aplicación con un InstallCode calculado en base a valores obtenidos del computador (InstallCodeSources=Machine_Data) como lo hicimos en este ejemplo, los datos del usuario son opcionales. Ud. podría omitirlos por completo y podría ser una buena alternativa si utiliza el OLM básico. Pero si utiliza el OLM avanzado, es muy probable que le interese tener los datos de sus usuarios en la base de datos del OLM.

 

Después de iniciado el periodo trial podrá ver que el estado corriente de registración ha cambiado como puede ver abajo:

 

demo01a07

 

Con el botón [Continue >>] abandonamos el formulario de registración y si la aplicación está registrada pasamos directamente al formulario principal de la aplicación. Vea en Ingresar datos del usuario el codigo asociado con este botón que permite advertir al usuario que aún no ha ingresado sus datos de usuario.

 

demo1a07b

 

Si responde [Ok] no se saldrá del formulario de registración y tendrá la oportunidad de ingresar los datos de usuario, pero si responde [Ignore] abandonará el formulario aunque no se hayan ingresado los datos del usuario.

 

Finalmente pasará al formulario principal de la aplicación:

 

demo01a08

Aquí tiene el botón [Registration Form] que le permitirá acceder al formulario de registración cada vez que lo desee y especialmente cuando ya esté registrado dado que este ya no surgirá automáticamente al iniciar el programa, sino que pasará directamente al formulario principal. Cierre la aplicación y ábrala nuevamente y podrá comprobarlo.

 

Borrar la registración existente

 

Los datos de registración siempre se guardan en el computador donde se registra la aplicación (Datos Locales) y si el usuario tiene conexión a Internet posiblemente también estén guardados en el sitio web (Datos en Línea). Como vimos en el apartado anterior, el modo en que se realiza la registración depende del valor que tenga el directivo siguiente:

{$DEFINE ADVANCED_OLM} //Options are BASIC_OLM, ADVANCED_OLM, NO_OLM

en este caso definido para utilizar el OLM avanzado.

 

Si Ud. inició el periodo trial con el directivo {$DEFINE NO_OLM} se habría ejecutado el método MakeTrial al iniciar el periodo trial y los datos estarían guardados solo en el computador y si lo inició con el directivo {$DEFINE BASIC_OLM} los datos de la clave deberían haberse guardado en ambos lugares pero los datos de usuario solo localmente, pero si inició el periodo trial con {$DEFINE ADVANCED_OLM}, los datos de la clave y del usuario deberían haberse guardado en ambos lugares; su computador y en el sitio web.  Vea abajo el código que se ejecuta según sea el directivo definido:

 

 

procedure TRegForm.BtnRemoveClick(Sender: TObject);

var ok:boolean;

   s,msg:string;

begin

 if Form1.AVLock.EraseReg

 then msg:= 'Local registration data removed'+#13#10

 else msg:= 'Could not remove Local registration data'+#13#10;

 ok:=False;

 {$IFDEF BASIC_OLM}

   ok:= Form1.AVLock.OnlineRemoveKey(0); //remove regitration data from the Basic OLM

 {$ENDIF}

 {$IFDEF ADVANCED_OLM}

   s:= Form1.AVLock.OnlineRemoveReg(0); //remove regitration data from the Advanced OLM

   ok:= ((s='00') or (s='11'));

{$ENDIF}

 if ok then msg:=msg+'Online registration data removed'

 else msg:=msg+'Could not remove Online registration data';

 showmessage(msg);

 GetRegStatus;

end;

 

Entre al formulario de registración con el botón [Registration Form] y borre la registración con el botón [Remove Registration]. Verá el siguiente mensaje informándole del resultado de la operación:

 

demo01a09

 

Ahora al hacer click sobre el botón [Continue >>] terminará la ejecución del programa, volviendo a la situación inicial.

 

Si Ud. inició el periodo trial teniendo definido el directivo {$DEFINE NO_OLM} solo tendrá datos locales de registración, y el método utilizado Erasereg() lo único que hace es borrar el archivo *.avr que también se puede eliminar manualmente, por lo que no recomendamos el uso de esta opción.

 

Con las otras opciones {$DEFINE BASIC_OLM} y {$DEFINE ADVANCED_OLM} se eliminan los datos de  registración el el sitio web. En el primer caso se trata de un fichero que es borrado con el método OnlineRemoveKey y en el segundo se trata de un registro de base de datos que es eliminado con el método OnlineRemoveReg.

 

Los métodos OnlineRemoveKey y OnlineRemoveReg eliminan los datos de registración en el sitio web por lo tanto no deberá permitir que el usuario pueda acceder a estas utilidades en la versión definitiva de su aplicación, si está utilizando en su aplicación un panel de utilidades como el de este ejemplo, remuevalo en la versión definitiva como nosotros lo hacemos en la versión 1b.

 

No se preocupe pensando que tal vez un usuario pueda descargar el paquete de AVLock SIMPLE y teniendo el código fuente de los ejemplos pueda llegar a utilizar estos métodos para burlar la seguridad de su aplicación, esto no es posible ya que para hacerlo debería conocer el AppID y las claves de encriptación que Ud. está utilizando.  

 

Vea abajo como se guardan los datos de registración en el OLM básico.

 

demo02a03

 

 

 

Registrar la aplicación utilizando claves de registración

 

Cada vez que Ud. inició el periodo trial internamente se generó y registró una clave de registración. Normalmente el periodo trial se inicia con los dos métodos ya vistos, con MakeTrial() o con el OLM, pero también se puede hacer utilizando una clave de registración.

Vamos a suponer que Ud. no quiere que el periodo trial se inicie automáticamente y le sugiere a los usuarios que le envíen el código InstallCode a fin de generar una clave que les permita iniciar el periodo trial. Este método es muy seguro y no requiere que Ud. utilice el OLM.

 

Para generar la clave utilizamos la utilidad keygen.exe

 

Generemos una clave trial de 50 días como se muestra abajo:

 

demo01a13

 

La clave generada se puede enviar al usuario de distintas maneras, una de ellas es guardando la clave como archivo texto utilizando el botón [Save to file]. Este permite guardarlo con la extensión *.txt o *.avk.

 

Introduzcamos la clave generada dentro del formulario de registración copiando y pegando o con el botón [Load from file] y hagamos click sobre el botón [Register].

 

demo01a14

si no cometió errores deberá recibir un mensaje como el que se ve abajo, con el estado de registración a 50 días.

demo01a15

 

Se pueden generar distintos tipos de claves:

Permanentes: Nunca expiran.

Temporarias: Igual que las claves trial. Pensadas para rentar la aplicación por mes, año, etc.

Trial: Pensada para el periodo inicial de prueba.

Unregister Key: Elimina los datos locales de registración que correspondan al Index utilizado para generar la clave.

Unregister All: Elimina todos los datos locales de registración.

 

Sincronizar los datos y renovar la registración desde el OLM

 

En este ejemplo tenemos los siguientes tres botones: [Synchronize], [Renew and Synchronize] y [Full Synchronize]. Aquí se utilizan tres métodos alternativos para realizar la tarea de sincronizar los datos con el servidor. Analicemos cada uno de ellos:

 

Synchronize: Utiliza el siguiente código:

 

procedure TRegForm.BtnSynchClick(Sender: TObject);

var res:string;

begin

 {$IFDEF BASIC_OLM}

   showmessage('Not allowed from the Basic OLM');

 {$ENDIF}

 {$IFDEF ADVANCED_OLM}

   res := Form1.AVLock.OnlineSynch(0);

   if (res='00') then begin

      GetRegStatus;

      showmessage('User and Key data Synchronized');

   else  showmessage('ERROR: '+res);

 {$ENDIF}

end;

 

El método OnlineSynch() funciona para registros primarios y secundarios. Accede a la base de datos del OLM avanzado y lee los datos de la clave y del usuario y los guarda en el fichero *.avr de datos de registración local. Si la operación fue exitosa retorna '00', en caso contrario retorna un código de error.

 

Renew and Synchronize: Utiliza el siguiente código:

 

procedure TRegForm.BtnRenewClick(Sender: TObject);

var res, msg:string;

begin

{$IFDEF BASIC_OLM}

   showmessage('Not allowed from the Basic OLM');

 {$ENDIF}

 {$IFDEF ADVANCED_OLM}

   res := Form1.AVLock.OnlineRenew(0);

   if (res='00') or (res='') then GetRegStatus;

   if (res='00') then msg:='User Data synchronized and Renewal Applied'

   else if (res='') then msg:='User Data synchronized'

   else msg:='ERROR: '+res;

   showmessage(msg);

{$ENDIF}

end;

 

El método OnlineRenew() funciona solo para registros primarios. Realiza dos operaciones:

1) Sincroniza los datos del usuario. Lee del registro correspondiente del OLM los datos del usuario y los guarda en el computador en los datos locales de registración.

2) Renueva la clave de registración. Si el campo Paid tiene el valor 'Y' (se pagó por una nueva clave) genera una nueva clave de registración en base a los valores de los campos users, instances, days y values y la guarda en el OLM reemplazando la existente y también la guarda en los datos locales de registración. Se puede utilizar para registrar un nuevo periodo temporal o para hacer un upgrade habilitando nuevas opciones en la aplicación a través de un nuevo campo values.

Si el método retorna '00' significa que ambas operaciones se han realizado y si retorna un string vacío '' significa que solo se han sincronizado los datos del usuario debido a que el campo Paid tenía el valor 'N'.

 

Full Synchronize: Utiliza el siguiente código:

 

procedure TRegForm.BtnFullClick(Sender: TObject);

var res, msg:string;

begin

{$IFDEF BASIC_OLM}

   showmessage('Not allowed from the Basic OLM');

{$ENDIF}

 {$IFDEF ADVANCED_OLM}

   res := Form1.AVLock.OnlineFullSynch(0);

   if (res='00') or (res='') then GetRegStatus;

   if (res='00') then msg:='User and Key data synchronized and/or renewal applied and/or Trial Started'

   else if (res='') then msg:='Synchronized User data only'

   else msg :='ERROR: '+res;

   showmessage(msg);

{$ENDIF}

end;

 

El método OnlineFullSynch podría ser utilizado en reemplazo de los siguientes métodos ya analizados anteriormente:

 

1) OnlineStartTrial()

2) OnlineSynch()

3) OnlineRenew()

4) OnlineExtendTrial()

 

De esta manera con una sola función estaríamos cubriendo prácticamente todas las funciones necesarias de registración en línea. Según sea la situación realiza una u otra de las acciones enumeradas arriba:

 

1) Si el campo Paid es 'Y' realiza la funcionalidad de OnlineRenew() generando una nueva clave de registración  y guardandola en el OLM y localmente.

2) Si el campo Extend es 'Y' realiza la funcionalidad de OnlineExtendTrial() generando una nueva clave de registración de tipo trial a fin de ampliar el periodo de prueba y guardandola en el OLM y en los datos locales de registración.

3) Si el registro en el OLM no existe, lo que indicaría que se está ejecutando la aplicación por primera vez, realiza la funcionalidad de OnlineStartTrial() generando un nuevo registro con una clave basada en los valores por defecto para periodos trial, valores que se pueden cambiar editando los scripts php del OLM.

4) Si el registro existe lee del OLM los datos del usuario y los guarda en los datos locales de registración, asi como lo hace OnlineSynch().

 

Este método funciona con registros primarios y secundarios.

 

 

Controlar la fecha del computador

 

Durante el periodo trial y periodos de claves temporarias existe el riesgo potencial de que el usuario intente atrasar la fecha del computador para utilizar la aplicación por más tiempo que el establecido. Para evitar esto se agregaron los siguientes métodos:

 

GetOnlineDate(): Obtiene desde Internet la fecha actual correcta.

FixSystemDate(): Permite modificar la fecha del computador asignandole una fecha dada como parámetro.

OnlineCheckDate(): Internamente utiliza los dos métodos anteriores para obtener de Internet la fecha correcta y asignarla al computador. Además guarda la última fecha alcanzada (LastDate) junto con los datos de registración, después cuando se obtiene el estado de registración con GetKeyData también se lee esta fecha y se la compara con la fecha del computador y si LastDate es mayor a la del computador se considera que el usuario ha atrasado la fecha y se marca como True el campo DateBacked dentro de los datos de la clave (KeyData) obtenidos.

 

Con el botón [Check System Date] se utiliza GetOnlineDate() para obtener la fecha de Internet y después se la compara con la fecha local y si no corresponde se pregunta al usuario si desea modificarla y en caso afirmativo se aplica FixSystemDate().

 

Con el botón [Check and Fix System Date] se utiliza OnlineCheckDate() para hacer lo mismo pero sin dar al usuario la posibilidad de aprobar la operación. Este método tiene un parámetro booleano "fix" que si se hace true aplica la corrección y en caso contrario no lo hace. Esta opción solo se puede aplicar cuando existen datos de registración locales desde donde lee la fecha guardada LastDate, por eso en el ejemplo se ejecuta únicamente si la aplicación ya está registrada.

 

 

 

El ejemplo 1b

 

El ejemplo 1b es la versión definitiva del programa. Se eliminó la sección de utilidades para el desarrollador (al pie) ya que estas son herramientas que le sirven al programador para ver que el mecanismo de registración esté funcionando correctamente pero que no deben estar en la versión definitiva. Abajo puede ver el formulario de registración en el IDE de Delphi.

 

example01bregform

 

Además de eliminar todos los botones utilitarios de la versión 1a, se hicieron los siguientes cambios en al código:

 

En el evento OnCreate se agregaron: un chequeo de la fecha del sistema con corrección automática. Un llamado a StartTrial para iniciar el periodo trial automáticamente y un llamado a OnlineRenew para poder renovar automáticamente la registración a través del OLM.

 

procedure TRegForm.FormCreate(Sender: TObject);

begin

 if (keydata.Status = registered) and connected then Form1.AVLock.OnlineCheckDate(true); //fix system date

 GetRegStatus;

 testfields0:=testfields;

 Changed:=False;

 StartTrial;

 Form1.AVLock.OnlineRenew(0);

end;