123 lines
5.8 KiB
Plaintext
123 lines
5.8 KiB
Plaintext
sample - sample code for DinkeyPro/FD in 4D
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
This sample code is written using 4D v12 but will work with later versions of 4D.
|
|
|
|
The sample code calls a 4D plugin which we provide. This plugin is compatible with
|
|
4D versions 11 and higher. It is called ddpro.bundle. This is a series of directories
|
|
and files. The most important are shown here:
|
|
|
|
ddpro.bundle
|
|
Contents
|
|
Windows
|
|
ddpro.4dx
|
|
Windows64
|
|
ddpro.4dx
|
|
MacOS
|
|
ddpro
|
|
Resources
|
|
|
|
This same bundle is provided in the Windows and Mac OSX SDKs and will support Mac OS X and
|
|
Windows 32-bit and 64-bit Operating Systems.
|
|
|
|
For Mac OS X this directory structure is recognised as a single file: ddpro.bundle. You can
|
|
explore the contents of the bundle by choosing "Show Package Contents".
|
|
|
|
For the sample database to work properly you need to have a Plugins folder (located in the same
|
|
place as the sample database) and include the protected ddpro.bundle in the Plugins folder.
|
|
|
|
For Mac machines you just place ddpro.bundle in this folder. For Windows you need to copy
|
|
the whole structure to the Plugins folder.
|
|
|
|
Note - the actual Plugin file you need to protect is the file in Contents\<OS name>.
|
|
For Windows it is called ddpro.4dx. For Mac OSX it is called ddpro. You need to protect
|
|
this file (and not your database) with DinkeyAdd with the API Method. You should protect
|
|
the relevant file for each Operating System you want to support. So, for example, if you
|
|
want to support MacOSX and 32-bit, 64-bit Windows you should protect these files:
|
|
ddpro.bundle\Contents\Windows\ddpro.4dx
|
|
ddpro.bundle\Contents\Windows64\ddpro.4dx
|
|
ddpro.bundle\Contents\MacOS\ddpro
|
|
|
|
If you don't want to support a particular operating system you can delete that folder.
|
|
|
|
Because your database is dependent on the protected plugin then it is itself protected.
|
|
|
|
You can then supply the whole protected bundle to your customers.
|
|
|
|
The sample code contains many Project Methods. However, there are 10 main functions
|
|
that you can use in your code. You will not need to use all these functions in your
|
|
code. Just use which ever functions are most appropriate and customise in your own way.
|
|
The sample code is just a guide. You should implement the protection in a stronger way
|
|
using the techniques described in the "Increasing your Protection" chapter of the manual.
|
|
|
|
For example you can call one (or more) of these functions when your database opens.
|
|
(Database Methods | On Startup). This has been implemented in the sample code but has
|
|
been commented out otherwise you would need a correctly programmed dongle to open it!
|
|
For this reason it is probably best to keep an unprotected copy of your database before
|
|
you start adding protection.
|
|
|
|
The 10 main functions are:
|
|
|
|
// this file contains 10 protection-check functions.
|
|
ProtCheck a standard protection check
|
|
ProtCheckWithAlg a protection check & executing an Algorithm
|
|
WriteBytes a protection check & write data to the dongle
|
|
ReadBytes a protection check & read data from the dongle
|
|
EncryptUserData a protection check & encrypting data and then decrypting the data
|
|
// these functions are the same as the functions listed above but encrypting all parameters passed to our API
|
|
ProtCheckEnc a standard protection check
|
|
ProtCheckWithAlgEnc a protection check & executing an Algorithm
|
|
WriteBytesEnc a protection check & write data to the dongle
|
|
ReadBytesEnc a protection check & read data from the dongle
|
|
EncryptUserDataEnc a protection check & encrypting data and then decrypting the data
|
|
|
|
If you are using Dinkey Lite then you can only use 4 functions:
|
|
ProtCheck, ProtCheckWithAlg, ProtCheckEnc, ProtCheckWithAlgEnc
|
|
|
|
These functions also depend on some other simpler functions (check to see which functions
|
|
are references and also include those in your code). For example, you will always need
|
|
to include:
|
|
|
|
InitialiseDris
|
|
SetDrisFunction
|
|
SetDrisFlags
|
|
DisplayError
|
|
GetDrisSDSN
|
|
GetDrisExtErr
|
|
|
|
The sample code has been implemented so that you build up the DRIS as a BLOB variable.
|
|
We have provided SetDris... functions to set various values in the DRIS and GetDris...
|
|
functions to get values fro the Dris. So you will also need to include all the GetDris...
|
|
and SetDris... functions that you need.
|
|
|
|
Code marked with !!!! are places where you should customise the sample code so
|
|
that it will work properly:
|
|
|
|
* Change the SDSN value from 10101 to the value of your SDSN in the 10 main functions.
|
|
* Change the Product Code value from DEMO if you are using ProtCheck or ProtCheckEnc functions.
|
|
* Change the MyAlgorithm code (if you call a user algorithm)
|
|
* Change the CryptDRIS code (if you encrypt the DRIS)
|
|
* Change the CryptApiData (if you encrypt Data you send to our API)
|
|
* Change the MyRWAlgorithm code (if encrypt Data you send to our API using the R/W algorithm)
|
|
|
|
You will also probably want to replace our error messages (DisplayError) with your own.
|
|
|
|
Note:
|
|
|
|
When you first use the plug-in you will get error 413. This is because you have not
|
|
protected it. To do this run DinkeyAdd and protect the plug-in file specifying the API Method.
|
|
Note - you should protect our 4D plugin and not your program. Because your program depends
|
|
on the 4D plugin it is also protected. See notes at the beginning of this file for more details.
|
|
|
|
Note:
|
|
|
|
We needed to insert an extra line of code into the sample just before the protection check:
|
|
|
|
// this line is only required because of a bug in 4D (see readme.txt for more info)
|
|
SET BLOB SIZE($dris;DRIS SIZE;0)
|
|
|
|
This is due to a bug in 4D which causes 4D to crash if the database is running in compiled
|
|
mode (or as a 4DC file). This bug existed in 4D v12.6. It may have been fixed in later versions
|
|
in which case you can remove this line. However, there is no harm in continuing to include
|
|
this line in your code.
|
|
|