Add Original SDK
This commit is contained in:
293
Dinkey Pro 7.6.1/Samples/PHP/README.html
Normal file
293
Dinkey Pro 7.6.1/Samples/PHP/README.html
Normal file
@@ -0,0 +1,293 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Using Dinkey Pro/FD with PHP</title>
|
||||
<style>
|
||||
body {
|
||||
color: black;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: 13px;
|
||||
margin: 25px auto;
|
||||
max-width: 800px;
|
||||
}
|
||||
p, ul, ol, table {
|
||||
margin-top: 0;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
ul.contents a {
|
||||
text-decoration: none;
|
||||
}
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
margin-top: 25px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
h2 {
|
||||
border-top: 1px solid gray;
|
||||
}
|
||||
table {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid black;
|
||||
padding: 0.5em;
|
||||
text-align: left;
|
||||
}
|
||||
.ui_element
|
||||
{ /* Use for things like program options and menu items */
|
||||
color: #008000;
|
||||
font-style: italic;
|
||||
}
|
||||
.filepath
|
||||
{ /* Use for paths and filenames */
|
||||
font-family: monospace;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.manual
|
||||
{ /* Use when referring to user manual sections/chapters */
|
||||
font-style: italic;
|
||||
}
|
||||
.alert
|
||||
{
|
||||
border: 1px solid black;
|
||||
padding: 15px 15px 15px 58px;
|
||||
font-weight: bold;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 5px 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.important
|
||||
{
|
||||
background-color: #FFFDD0;
|
||||
background-image: url('data:image/png;base64,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');
|
||||
}
|
||||
.information
|
||||
{
|
||||
background-color: #EBF8FF;
|
||||
background-image: url('data:image/png;base64,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');
|
||||
}
|
||||
.alert > p:last-child, .alert > ul:last-child, .alert > ol:last-child
|
||||
{
|
||||
/* Cancel double space at bottom of alert caused by above rule */
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.important .filepath, .information .filepath {
|
||||
/* Make filepaths stand out in sections that are already bold */
|
||||
font-weight: normal;
|
||||
}
|
||||
div.col_wrapper
|
||||
{
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
}
|
||||
div.two_col
|
||||
{
|
||||
width: 50%;
|
||||
float: left;
|
||||
}
|
||||
code {
|
||||
color: gray;
|
||||
white-space: nowrap;
|
||||
}
|
||||
pre {
|
||||
padding: 15px;
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
pre > code { /* Block level code snippets */
|
||||
white-space: pre; /* Override nowrap used for inline code */
|
||||
color: inherit;
|
||||
}
|
||||
code .comment
|
||||
{
|
||||
color: green;
|
||||
}
|
||||
code .keyword
|
||||
{
|
||||
font-weight: bold;
|
||||
color: blue;
|
||||
}
|
||||
code .string
|
||||
{
|
||||
color: #A00000;
|
||||
}
|
||||
code .constant
|
||||
{
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Using Dinkey Pro/FD with PHP</h1>
|
||||
<div class="alert information">
|
||||
<p>
|
||||
Protection checks in PHP are implemented using a PHP extension to communicate with the dongle.
|
||||
You should use DinkeyAdd to lock this extension with the API protection method as described in the user manual, and distribute the locked file(s) with your software.
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
If you are not already familiar with using PHP extensions, it is strongly recommended that you read the PHP documentation on the subject.
|
||||
The Dinkey Pro/FD SDK includes a large number of different PHP extension files. Which one(s) you need to use depends on several factors,
|
||||
including operating system, PHP version, architecture (e.g. x86 or x64) and thread safety.
|
||||
This sample code includes a script, <span class="filepath">extensionhelper.php</span>, that detects these factors,
|
||||
indicates which extension is appropriate, and provides basic installation instructions.
|
||||
</p>
|
||||
<p>
|
||||
It is important that you consider which system configuration(s) your protected software will support,
|
||||
and distribute the corresponding PHP extension(s).
|
||||
You may wish to distribute <span class="filepath">extensionhelper.php</span> along with your software
|
||||
to help your users to install the correct extension for their system.
|
||||
See <span class="manual">Supported Versions</span> below for full information on the platforms supported by Dinkey Pro/FD.
|
||||
</p>
|
||||
<p>
|
||||
Do not specify a <em>calling program</em> when locking the PHP extensions.
|
||||
The calling program for PHP code is the user's web server (or PHP CLI), which will be different for different users.
|
||||
</p>
|
||||
<div class="alert important">
|
||||
<p>
|
||||
Before you distribute your PHP code, you must protect it from modification using a third-party tool such as
|
||||
<a href="https://www.sourceguardian.com/">SourceGuardian</a>.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<h2>API Reference</h2>
|
||||
<p>
|
||||
See <span class="manual">Modifying Your Code</span> in the user manual for general information about the Dinkey Pro/FD API.
|
||||
In PHP, <code>DDProtCheck()</code> and the <code>DRIS</code> structure are not directly accessible.
|
||||
Instead, the PHP API provides two sets of functions: wrappers to <code>DDProtCheck()</code> that also take parameters that set DRIS input fields;
|
||||
and functions that access DRIS output fields.
|
||||
</p>
|
||||
|
||||
<h3>Protection Check Functions</h3>
|
||||
<p>
|
||||
These functions each provide a wrapper to <code>DDProtCheck()</code> using a different <code>function</code> value.
|
||||
Each function's return value is the return value of <code>DDProtCheck()</code> - zero on success, or a value indicating the cause of the error on failure.
|
||||
</p>
|
||||
|
||||
<h4>DDSimpleCheck ( int $flags ) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code> DRIS field and calls <code>DDProtCheck()</code> with the <code>PROTECTION_CHECK</code> function.
|
||||
</p>
|
||||
|
||||
<h4>DDSimpleCheckEx ( int $flags , int $execs_decrement, string $alt_licence_name ) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code>, <code>execs_decrement</code> and <code>alt_licence_name</code> DRIS fields
|
||||
and calls <code>DDProtCheck()</code> with the <code>PROTECTION_CHECK</code> function.
|
||||
</p>
|
||||
|
||||
<h4>DDSimpleCheckAlg ( int $flags , int $alg_num , int $var_a , int $var_b , int $var_c , int $var_d , int $var_e , int $var_f , int $var_g , int $var_h ) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code>, <code>alg_num</code> and <code>var_a</code> to <code>var_h</code> DRIS fields
|
||||
and calls <code>DDProtCheck()</code> with the <code>EXECUTE_ALGORITHM</code> function.
|
||||
</p>
|
||||
|
||||
<h4>DDSimpleCheckAlgEx ( int $flags , int $execs_dec, string $alt_licence_name , int $alg_number , int $var_a , int $var_b , int $var_c , int $var_d , int $var_e , int $var_f , int $var_g , int $var_h ) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code>, <code>execs_decrement</code>, <code>alt_licence_name</code>, <code>alg_num</code> and <code>var_a</code> to <code>var_h</code> DRIS fields
|
||||
and calls <code>DDProtCheck()</code> with the <code>EXECUTE_ALGORITHM</code> function.
|
||||
</p>
|
||||
|
||||
<h4>DDWriteString ( int $flags , int $rw_offset , string $rw_data ) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code>, <code>rw_offset</code> and <code>rw_data</code> DRIS fields
|
||||
and calls <code>DDProtCheck()</code> with the <code>WRITE_DATA_AREA</code> function.
|
||||
</p>
|
||||
<p>
|
||||
<code>$rw_data</code> must be an ASCII string. To write binary data, first encode it using <code>base64_encode()</code>.
|
||||
The <code>rw_length</code> DRIS field is automatically set to the length of <code>$rw_data</code>.
|
||||
</p>
|
||||
|
||||
<h4>DDReadString ( int $flags , int $rw_offset , int $rw_length , string &$rw_data) : int</h4>
|
||||
<p>
|
||||
Sets the <code>flags</code>, <code>rw_offset</code> and <code>rw_length</code> DRIS fields
|
||||
and calls <code>DDProtCheck()</code> with the <code>READ_DATA_AREA</code> function.
|
||||
The data read is returned in <code>$rw_data</code>.
|
||||
</p>
|
||||
<p>
|
||||
Only use this function to read data that represents an ASCII string.
|
||||
If you read bytes that do not represent ASCII characters, the string value returned in <code>$rw_data</code> may be unpredictable.
|
||||
To read binary data, store it in the dongle data area as a base64-encoded sequence and use <code>base64_decode()</code> on the string returned in <code>$rw_data</code>.
|
||||
</p>
|
||||
|
||||
<h3>DDGet...() Functions</h3>
|
||||
<p>
|
||||
Each <code>DDGet...()</code> function takes one parameter by reference sets it to the value of the relevant DRIS element.
|
||||
See <span class="manual">Structures > DRIS Structure</span> in the user manual for more information about the DRIS and its fields.
|
||||
These functions return <code>TRUE</code> on success, or <code>FALSE</code> if the internal DRIS has not been populated by a call to one of the
|
||||
<code>DDProtCheck()</code> wrapper functions above.
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>DDGetExtendedError ( int &$ext_err ) : bool</code></li>
|
||||
<li><code>DDGetType ( int &$type ) : bool</code></li>
|
||||
<li><code>DDGetModel ( int &$model ) : bool</code></li>
|
||||
<li><code>DDGetSDSN ( int &$sdsn ) : bool</code></li>
|
||||
<li><code>DDGetProdCode ( string &$prodcode ) : bool</code></li>
|
||||
<li><code>DDGetDongleNumber ( int &$dongle_number ) : bool</code></li>
|
||||
<li><code>DDGetUpdateNumber ( int &$update_number ) : bool</code></li>
|
||||
<li><code>DDGetDataAreaSize ( int &$data_area_size ) : bool</code></li>
|
||||
<li><code>DDGetMaxAlgNum ( int &$max_alg_num ) : bool</code></li>
|
||||
<li><code>DDGetExecs ( int &$execs ) : bool</code></li>
|
||||
<li><code>DDGetExpDay ( int &$exp_day ) : bool</code></li>
|
||||
<li><code>DDGetExpMonth ( int &$exp_month ) : bool</code></li>
|
||||
<li><code>DDGetExpYear ( int &$exp_year ) : bool</code></li>
|
||||
<li><code>DDGetFeatures ( int &$features ) : bool</code></li>
|
||||
<li><code>DDGetNetUsers ( int &$net_users ) : bool</code></li>
|
||||
<li><code>DDGetAlgAnswer ( int &$alg_answer ) : bool</code></li>
|
||||
<li><code>DDGetFDCapacity ( int &$fd_capacity ) : bool</code></li>
|
||||
<li><code>DDGetFDDrive ( string &$fd_drive ) : bool</code></li>
|
||||
<li><code>DDGetSWKeyType ( int &$swkey_type ) : bool</code></li>
|
||||
<li><code>DDGetSWKeyExpDay ( int &$swkey_exp_day ) : bool</code></li>
|
||||
<li><code>DDGetSWKeyExpMonth ( int &$swkey_exp_month ) : bool</code></li>
|
||||
<li><code>DDGetSWKeyExpYear ( int &$swkey_exp_year ) : bool</code></li>
|
||||
</ul>
|
||||
|
||||
<h2>PHP Example Files</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<span class="filepath">dpsample.php</span> - various examples of using the Dinkey Pro/FD PHP API.
|
||||
This script outputs HTML and so is best used in a web server, but it can also be run using the PHP CLI.
|
||||
</li>
|
||||
<li>
|
||||
<span class="filepath">extensionhelper.php</span> - a script that detects system configuration to determine
|
||||
the appropriate PHP extension to use, and where it should be located.
|
||||
This script outputs HTML when used in a web server and plain text when executed by the PHP CLI.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>Supported Versions</h2>
|
||||
<p>
|
||||
The Dinkey Pro/FD SDK includes extensions for PHP versions 5.1 and newer on Windows and Linux.
|
||||
The x86 and x64 architectures are both supported, and extensions are provided for both Thread Safe (TS) and Non-Thread Safe (NTS) builds of PHP.
|
||||
Due to the large number of combinations of PHP version, OS, architecture and TS/NTS PHP builds,
|
||||
the exact extension for your system may not be included in the SDK.
|
||||
In this case, please contact us with full details of your platform.
|
||||
</p>
|
||||
|
||||
<h2>Try It Yourself</h2>
|
||||
<div class="alert important">
|
||||
<p>
|
||||
The sample code is designed to teach you how to use the Dinkey Pro/FD API in PHP programs.
|
||||
Do not copy the examples verbatim into your own code. Experiment with the sample code to understand how the API works,
|
||||
and read the chapter <span class="manual">Increasing Your Protection</span> in the user manual for many suggestions on how to
|
||||
make the best use of the API features.
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
To execute the sample code you will first need to use DinkeyAdd to produce a locked copy of the PHP extension for your system,
|
||||
and program a dongle (if you are using Plus or Net dongles). Place the locked extension in your PHP extensions directory.
|
||||
Use <span class="filepath">extensionhelper.php</span> to determine the correct extension and the location of the extensions directory for your system.
|
||||
</p>
|
||||
<p>
|
||||
<span class="filepath">dpsample.php</span> gives simple examples of performing a protection check,
|
||||
as well as using various other features of Dinkey Pro/FD.
|
||||
Browse the examples at the top of <span class="filepath">dpsample.php</span> to see how different features can be used,
|
||||
and uncomment the relevant lines to enable them.
|
||||
</p>
|
||||
<p>
|
||||
Not all features are supported by all dongle models.
|
||||
See the user manual for more information.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
181
Dinkey Pro 7.6.1/Samples/PHP/dpsample.php
Normal file
181
Dinkey Pro 7.6.1/Samples/PHP/dpsample.php
Normal file
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
/**
|
||||
* Example use of the Dinkey Pro/FD API in PHP.
|
||||
*
|
||||
* Copyright 2020 Microcosm Ltd.
|
||||
**/
|
||||
|
||||
// Possible flags values, as documented in the user manual
|
||||
define('DEC_ONE_EXEC', 1);
|
||||
define('DEC_MANY_EXECS', 2);
|
||||
define('START_NET_USER', 4);
|
||||
define('STOP_NET_USER', 8);
|
||||
define('USE_FUNCTION_ARGUMENT', 16);
|
||||
define('CHECK_LOCAL_FIRST', 32);
|
||||
define('CHECK_NETWORK_FIRST', 64);
|
||||
define('USE_ALT_LICENCE_NAME', 128);
|
||||
define('DONT_SET_MAXDAYS_EXPIRY', 256);
|
||||
define('MATCH_DONGLE_NUMBER', 512);
|
||||
define('DONT_RETURN_FD_DRIVE', 1024);
|
||||
|
||||
// Possible dongle type values
|
||||
define('DONGLE_TYPE_PRO', 1);
|
||||
define('DONGLE_TYPE_FD', 2);
|
||||
|
||||
// Possible dongle model values
|
||||
define('DONGLE_MODEL_LITE', 1); // Lite
|
||||
define('DONGLE_MODEL_PLUS', 2); // Plus
|
||||
define('DONGLE_MODEL_NET5', 4); // Net (5 users)
|
||||
define('DONGLE_MODEL_NETU', 7); // Net (unlimited users)
|
||||
|
||||
// Possible software key type values
|
||||
define('SOFTWARE_KEY_TYPE_NONE', 0);
|
||||
define('SOFTWARE_KEY_TYPE_TEMPORARY', 1);
|
||||
define('SOFTWARE_KEY_TYPE_DEMO', 2);
|
||||
|
||||
// These output variables are passed by reference and set by the API functions
|
||||
$algorithmResult = 0;
|
||||
$readStringOut = "";
|
||||
$extErr = 0;
|
||||
$type = 0;
|
||||
$model = 0;
|
||||
$sdsn = 0;
|
||||
$dongleNum = 0;
|
||||
$updateNum = 0;
|
||||
$dataAreaSize = 0;
|
||||
$maxAlgNum = 0;
|
||||
$execs = 0;
|
||||
$expDay = 0;
|
||||
$expMonth = 0;
|
||||
$expYear = 0;
|
||||
$features = 0;
|
||||
$netUsers = 0;
|
||||
$prodCode = "";
|
||||
$fdDrive = "";
|
||||
$softwareKeyType = 0;
|
||||
$swkeyExpDay = 0;
|
||||
$swkeyExpMonth = 0;
|
||||
$swkeyExpYear = 0;
|
||||
|
||||
// Below are several examples that each demonstrate different API functionality.
|
||||
// Uncomment the appropriate lines to execute the examples.
|
||||
|
||||
/**
|
||||
* An example of a basic protection check that decrements the execution counter by 1
|
||||
* and starts a new network user
|
||||
*/
|
||||
$retCode = DDSimpleCheck(DEC_ONE_EXEC|START_NET_USER);
|
||||
$algorithmResult = null;
|
||||
$readStringOut = null;
|
||||
|
||||
/**
|
||||
* An example of a basic protection check against a different licence to the one the PHP extension is locked to,
|
||||
* in this example a licence with name "alt"
|
||||
*/
|
||||
//$retCode = DDSimpleCheckEx(USE_ALT_LICENCE_NAME, 0, "alt");
|
||||
//$algorithmResult = null;
|
||||
//$readStringOut = null;
|
||||
|
||||
/*
|
||||
* An example of a protection check that executes the first algorithm stored in the dongle.
|
||||
* The best way to use this feature is to identify lines of code in your program
|
||||
* that can be represented by algorithms stored in the dongle,
|
||||
* and replace these lines with calls to the API.
|
||||
* Lite dongle users cannot change the algorithm stored in the dongles,
|
||||
* so should calculate the algorithm in their own code and compare the result with the one returned by the API.
|
||||
*/
|
||||
//$retCode = DDSimpleCheckAlg(0, 1, 1,2,3,4,5,6,7,8);
|
||||
//DDGetAlgAnswer($algorithmResult);
|
||||
//$readStringOut = null;
|
||||
|
||||
/**
|
||||
* An example of a protection check that executes the second algorithm stored in the dongle,
|
||||
* and also decrements the execution counter by 5
|
||||
*/
|
||||
//$retCode = DDSimpleCheckAlgEx(DEC_MANY_EXECS, 5, "", 2, 1,2,3,4,5,6,7,8);
|
||||
//DDGetAlgAnswer($algorithmResult);
|
||||
//$readStringOut = null;
|
||||
|
||||
/**
|
||||
* An example of a protection check that also writes data to the dongle's secure data area.
|
||||
* This feature is not supported by Lite dongles.
|
||||
* Make sure you specify a large enough data area size when adding protection with DinkeyAdd!
|
||||
*/
|
||||
//$retCode = DDWriteString(0, 0, "abcdef");
|
||||
//$algorithmResult = null;
|
||||
//$readStringOut = null;
|
||||
|
||||
/**
|
||||
* An example of a protection check that also reads data from the dongle's secure data area.
|
||||
* This feature is not supported by Lite dongles.
|
||||
* Make sure you specify a large enough data area size when adding protection with DinkeyAdd!
|
||||
*/
|
||||
//$retCode = DDReadString(0, 2, 3, $readStringOut);
|
||||
//$algorithmResult = null;
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Dinkey Pro/FD PHP API Sample Code</title>
|
||||
</head>
|
||||
<body style="font-family: monospace;">
|
||||
<?php if ($retCode != 0): ?>
|
||||
<p>
|
||||
Protection check failed
|
||||
</p>
|
||||
<p>
|
||||
Error Code: <?php echo $retCode; ?><br>
|
||||
Extended Error Code: <?php DDGetExtendedError($extErr); echo $extErr; ?><br>
|
||||
</p>
|
||||
<?php else: ?>
|
||||
<p>
|
||||
Protection check succeeded
|
||||
</p>
|
||||
<p>
|
||||
<?php if ($algorithmResult !== null): ?>
|
||||
Algorithm result: <?php echo $algorithmResult; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($readStringOut !== null): ?>
|
||||
Data read: <?php echo $readStringOut; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
SDSN: <?php DDGetSDSN($sdsn); echo $sdsn; ?><br>
|
||||
Product Code: <?php DDGetProductCode($prodCode); echo $prodCode; ?><br>
|
||||
Dongle Number: <?php DDGetDongleNumber($dongleNum); echo $dongleNum; ?><br>
|
||||
|
||||
Dongle Type: <?php DDGetType($type); echo $type; ?><br>
|
||||
|
||||
<?php if ($type == DONGLE_TYPE_FD): ?>
|
||||
Flash Drive Path: <?php DDGetFDDrive($fdDrive); echo $fdDrive; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
Dongle Model: <?php DDGetModel($model); echo $model; ?><br>
|
||||
|
||||
<?php if ($model > DONGLE_MODEL_LITE): ?>
|
||||
Update Number: <?php DDGetUpdateNumber($updateNum); echo $updateNum; ?><br>
|
||||
Data Area Size: <?php DDGetDataAreaSize($dataAreaSize); echo $dataAreaSize; ?><br>
|
||||
Max Algorithm Number: <?php DDGetMaxAlgNum($maxAlgNum); echo $maxAlgNum; ?><br>
|
||||
Executions: <?php DDGetExecs($execs); echo $execs; ?><br>
|
||||
Expiry Day: <?php DDGetExpDay($expDay); echo $expDay; ?><br>
|
||||
Expiry Month: <?php DDGetExpMonth($expMonth); echo $expMonth; ?><br>
|
||||
Expiry Year: <?php DDGetExpYear($expYear); echo $expYear; ?><br>
|
||||
Features: <?php DDGetFeatures($features); echo $features; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($model > DONGLE_MODEL_PLUS): ?>
|
||||
Maximum Simultaneous Network Users: <?php DDGetNetUsers($netUsers); echo $netUsers; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($softwareKeyType != SOFTWARE_KEY_TYPE_NONE): ?>
|
||||
Software Key Type: <?php DDGetSWKeyType($softwareKeyType); echo $softwareKeyType; ?><br>
|
||||
Software Key Expiry Day: <?php DDGetSWKeyExpDay($swkeyExpDay); echo $swkeyExpDay; ?><br>
|
||||
Software Key Expiry Month: <?php DDGetSWKeyExpMonth($swkeyExpMonth); echo $swkeyExpMonth; ?><br>
|
||||
Software Key Expiry Year: <?php DDGetSWKeyExpYear($swkeyExpYear); echo $swkeyExpYear; ?><br>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php endif; ?>
|
||||
</body>
|
||||
</html>
|
||||
146
Dinkey Pro 7.6.1/Samples/PHP/extensionhelper.php
Normal file
146
Dinkey Pro 7.6.1/Samples/PHP/extensionhelper.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
define("CLI", (bool)(strcasecmp(php_sapi_name(), "cli") == 0));
|
||||
|
||||
ob_start();
|
||||
ob_clean();
|
||||
phpinfo();
|
||||
define("PHPINFO", ob_get_contents());
|
||||
ob_end_clean();
|
||||
|
||||
function pretty_output($info)
|
||||
{
|
||||
$os = $info['server-config']['os'];
|
||||
$osFriendlyName = ( ($os=="lin") ? "Linux" : "Windows" );
|
||||
|
||||
if (CLI)
|
||||
{
|
||||
echo "
|
||||
Dinkey Pro/FD PHP Extension Helper
|
||||
==================================
|
||||
|
||||
System Configuration
|
||||
--------------------
|
||||
Operating System: $osFriendlyName
|
||||
PHP Version: {$info['server-config']['php-ver']}
|
||||
Compiler: ". ( ($os == "win") ? $info['server-config']['compiler'] : "Not Applicable" ) ."
|
||||
Thread Safety: ".(($info['server-config']['thread-safety'] == "ts") ? "Enabled" : "Disabled")."
|
||||
Architecture: {$info['server-config']['arch']}-bit
|
||||
PHP Extensions Directory: {$info['server-config']['ext-dir']}
|
||||
PHP Configuration File: {$info['server-config']['php-ini-filename']}
|
||||
|
||||
Use the following PHP extension on this system:
|
||||
{$info['dp-ext-filename']}
|
||||
|
||||
Installation
|
||||
------------
|
||||
1. Lock {$info['dp-ext-filename']} with DinkeyAdd and copy the locked file to {$info['server-config']['ext-dir']}
|
||||
2. Edit the {$info['server-config']['php-ini-filename']} file to include the following line:\n extension={$info['dp-ext-filename']}
|
||||
". (($info['server-config']['webserver'] != "") ? "3. Restart {$info['server-config']['webserver']}" : "") ."\n";
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Web-server output
|
||||
echo "
|
||||
<!DOCTYPE html>
|
||||
<html lang=\"en\">
|
||||
<head>
|
||||
<title>Dinkey Pro/FD PHP Extension Helper</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>System Configuration</h1>
|
||||
<table>
|
||||
<tr><td>Operating System:</td><td>$osFriendlyName</td></tr>
|
||||
<tr><td>PHP Version:</td><td>{$info['server-config']['php-ver']}</td></tr>
|
||||
". ( ($os == "win") ? "<tr><td>Compiler:</td><td>{$info['server-config']['compiler']}</td></tr>" : "" ) ."
|
||||
<tr><td>Thread Safety:</td><td>".(($info['server-config']['thread-safety'] == "ts") ? "Enabled" : "Disabled")."</td></tr>
|
||||
<tr><td>Architecture:</td><td>{$info['server-config']['arch']}-bit</td></tr>
|
||||
<tr><td>PHP Extensions Directory:</td><td>{$info['server-config']['ext-dir']}</td></tr>
|
||||
<tr><td>PHP Configuration File:</td><td>{$info['server-config']['php-ini-filename']}</td></tr>
|
||||
</table>
|
||||
<p>Use the following PHP extension on this system: <b>{$info['dp-ext-filename']}</b>.</p>
|
||||
<h1>Installation</h1>
|
||||
<ol>
|
||||
<li><p>Lock <b>{$info['dp-ext-filename']}</b> with DinkeyAdd and copy the locked file to <b>{$info['server-config']['ext-dir']}</b>.</p></li>
|
||||
<li><p>Edit the <b>{$info['server-config']['php-ini-filename']}</b> file to include the following line:<br> <b>extension={$info['dp-ext-filename']}</b></p></li>
|
||||
". (($info['server-config']['webserver'] != "") ? "<li><p>Restart {$info['server-config']['webserver']}.</p></li>" : "") ."
|
||||
</ol>
|
||||
</body>
|
||||
</html>
|
||||
";
|
||||
}
|
||||
|
||||
|
||||
$os = "";
|
||||
$version = "";
|
||||
$threadsafe = "";
|
||||
$compiler = "";
|
||||
$arch = "";
|
||||
|
||||
if (stristr(php_uname("s"), "linux") !== false)
|
||||
$os = "lin";
|
||||
else if (stristr(php_uname("s"), "win") !== false) // Windows can be given as "Windows NT", or "WINNT"... just search for "win"
|
||||
$os = "win";
|
||||
|
||||
$v = explode(".", PHP_VERSION);
|
||||
$version = $v[0] . "." . $v[1];
|
||||
|
||||
$matches = array();
|
||||
$match = (bool) preg_match("/php extension build[^,]+,([NTS]{2,3}),?(VC[0-9]+)?/i", PHPINFO, $matches);
|
||||
if ($match)
|
||||
{
|
||||
$threadsafe = strtolower($matches[1]);
|
||||
|
||||
if ($os == "win")
|
||||
$compiler = strtolower($matches[2]);
|
||||
}
|
||||
|
||||
$i = intval("9223372036854775807");
|
||||
$s = strval($i);
|
||||
if ($s == "9223372036854775807")
|
||||
$arch = "64";
|
||||
else
|
||||
$arch = "32";
|
||||
|
||||
if ($os == "")
|
||||
die("Error, could not detect operating system.");
|
||||
if ($threadsafe == "")
|
||||
die("Error, could not detect thread-safety setting.");
|
||||
if (($os == "win") && ($version >= 5.3) && ($compiler == ""))
|
||||
die("Error, could not detect compiler version.");
|
||||
|
||||
$filename = (($os=="lin") ? "lib" : "") . "dpphp-$os$arch-$version-$threadsafe" . (($os=="win" && $version>=5.3) ? "-$compiler" : "") . "." . (($os=="win") ? "dll" : "so");
|
||||
|
||||
$phpIniFilename = get_cfg_var('cfg_file_path');
|
||||
$extDir = ini_get("extension_dir");
|
||||
|
||||
$webserver = "";
|
||||
if (isset($_SERVER['SERVER_SOFTWARE']))
|
||||
{
|
||||
if (stripos($_SERVER['SERVER_SOFTWARE'], "iis") !== FALSE)
|
||||
$webserver = "Microsoft IIS";
|
||||
else if (stripos($_SERVER['SERVER_SOFTWARE'], "apache") !== FALSE)
|
||||
$webserver = "Apache";
|
||||
else
|
||||
$webserver = "your HTTP server software";
|
||||
}
|
||||
|
||||
$info = array(
|
||||
'server-config' => array(
|
||||
'os' => $os,
|
||||
'php-ver' => $version,
|
||||
'webserver' => $webserver,
|
||||
'compiler' => $compiler,
|
||||
'thread-safety' => (bool)($threadsafe == "ts"),
|
||||
'arch' => $arch,
|
||||
'ext-dir' => $extDir,
|
||||
'php-ini-filename' => $phpIniFilename
|
||||
),
|
||||
|
||||
'dp-ext-filename' => $filename,
|
||||
);
|
||||
|
||||
pretty_output($info);
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user