225 lines
7.0 KiB
PHP
225 lines
7.0 KiB
PHP
<?php
|
|
/**
|
|
* Library that provides common functions that are used to help integrating Feebee Authentication in a PHP web site
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* Errors codes
|
|
*/
|
|
define ("FBAUTH_ERR_INVALID_DEV_STATUS",901); // The satus of the device is not FBAUTH_STATUS_OK
|
|
define ("FBAUTH_ERR_INTERNAL",902); // Should never occurd
|
|
define ("FBAUTH_ERR_OUTDATED_RND_TOKEN",910); // You random token is too old
|
|
define ("FBAUTH_ERR_INVALID_OTP",911); // The otp was not correct
|
|
|
|
/**
|
|
* Those errors are considered as an attack and your site will be blacklisted during one minute
|
|
* if you receive one of those errors
|
|
*/
|
|
define ("FBAUTH_ERR_BADLY_ENCODED_REQUEST",920);
|
|
define ("FBAUTH_ERR_INVALID_RND_TOKEN",921);
|
|
define ("FBAUTH_ERR_DEV_NOT_FOUND",922);
|
|
|
|
/**
|
|
* The last error of an operation is alway put in this global var
|
|
*/
|
|
global $gAuthErr;
|
|
|
|
$gAuthErr = 0;
|
|
|
|
|
|
/**
|
|
* Get a Random Token from a Token Server
|
|
* The RT is a 64 vhars hexadecimal value
|
|
* You should better use FbAuth_GetFastRndToken() for performance
|
|
* @access public
|
|
*/
|
|
function FbAuth_GetRndToken()
|
|
{
|
|
return @file_get_contents('http://auth-rnd-gen.musbe.net/FULL-RND-TOKEN');
|
|
}
|
|
|
|
|
|
/**
|
|
* Get a Half Random Token from a Token Server
|
|
* The RT is a 64 vhars hexadecimal value
|
|
* Use this value if you want to make your own FbAuth_GetFastRndToken()
|
|
* @access public
|
|
*/
|
|
function FbAuth_GetHalfRndToken()
|
|
{
|
|
return @file_get_contents('http://auth-rnd-gen.musbe.net/HALF-RND-TOKEN');
|
|
}
|
|
|
|
|
|
/**
|
|
* Get a Random Token
|
|
* The RT is a 64 vhars hexadecimal value
|
|
* This function generates a unique random token for each call but call the
|
|
* server only once every 30 seconds.
|
|
* You should always use this function to get random token.
|
|
* @access public
|
|
*/
|
|
function FbAuth_GetFastRndToken()
|
|
{
|
|
$res = "";
|
|
|
|
// We check if we have a valid RT is the session
|
|
if (isset($_SESSION['rnd-token-date']))
|
|
if (time() - $_SESSION['rnd-token-date'] < 30)
|
|
$res = $_SESSION['rnd-token'];
|
|
|
|
// If not we try to get it from a temp file (PHP >= 5.2.1 only)
|
|
if (strlen($res) != 32)
|
|
{
|
|
if (function_exists('sys_get_temp_dir') )
|
|
{
|
|
$tempdir = sys_get_temp_dir();
|
|
$modif = filemtime($tempdir."/feebee-rnd-token");
|
|
if ($modif != false)
|
|
if (time() - $modif < 30)
|
|
{
|
|
$res = @file_get_contents($tempdir."/feebee-rnd-token");
|
|
if (strlen($res) != 32)
|
|
$res = "";
|
|
else
|
|
{
|
|
$_SESSION['rnd-token'] = $res;
|
|
$_SESSION['rnd-token-date'] = $modif;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we don't have a valid RT here we have to get it from the server
|
|
if (strlen($res) != 32)
|
|
{
|
|
$res = substr(FbAuth_GetHalfRndToken(), 0, 32);
|
|
$_SESSION['rnd-token'] = $res;
|
|
$_SESSION['rnd-token-date'] = time();
|
|
if (isset($tempdir))
|
|
{
|
|
$file = fopen ($tempdir."/feebee-rnd-token" , "w");
|
|
@fwrite($file, $res);
|
|
@fclose($file);
|
|
}
|
|
}
|
|
|
|
return $res.strtoupper(md5("Musbe Authentication Key" + mt_rand() + date(DATE_ATOM)));
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks the result of an http request
|
|
*
|
|
* @param res the result of the http request
|
|
* @param header the header returned by the http request
|
|
* @access private
|
|
*/
|
|
function FbAuth_CheckForOK($res, $header)
|
|
{
|
|
$err = substr($header, 9, 3); //HTTP/1.0
|
|
|
|
if ($res == "OK" && $err == 200)
|
|
return true;
|
|
|
|
global $gAuthErr;
|
|
if ($err != "")
|
|
$gAuthErr = $err;
|
|
else
|
|
$gAuthErr = "Unknown Error";
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks that an OTP generated by a Feebee is valid
|
|
*
|
|
* @param fbid The id of the feebee
|
|
* @param rt The random token used to generate the otp
|
|
* @param otp The otp generated by the feebee
|
|
* @return true or false
|
|
* @access public
|
|
*/
|
|
function FbAuth_CheckOtp($fbid, $rt, $otp)
|
|
{
|
|
global $http_response_header;
|
|
$res = file_get_contents('http://auth-check.musbe.net/CHECK-OTP/'.$fbid.'/'.$rt.'/'.$otp);
|
|
return FbAuth_CheckForOK($res, $http_response_header[0]);
|
|
}
|
|
|
|
|
|
/**
|
|
* Values that are associated with a key.
|
|
* The following values can be returned by the FbAuth_GetStatus() function
|
|
*/
|
|
define ("FBAUTH_STATUS_OK",0);
|
|
define ("FBAUTH_STATUS_NOT_FOUND",1); // The key does not exist in the db
|
|
define ("FBAUTH_STATUS_INACTIVE",2); // The key has never been activated
|
|
define ("FBAUTH_STATUS_LOST",3); // The user has lost his key
|
|
define ("FBAUTH_STATUS_STOLLEN",4); // The key was stollen
|
|
define ("FBAUTH_STATUS_FEE_DUE",5); // The annual fee was not paid
|
|
define ("FBAUTH_STATUS_OBSOLETE",6); // The hardware is no longer supported
|
|
define ("FBAUTH_STATUS_UNKOWN",201); // We could not connect to the authentication server
|
|
|
|
/**
|
|
* Values that are associated with a key.
|
|
* The Javascript Api can also return the following values
|
|
*/
|
|
define ("FBAUTH_STATUS_REPLACED",100); // This key has been replaced by a backup key
|
|
define ("FBAUTH_STATUS_BACKUP_KEY",101); // This key is a backup key that is not activated yet
|
|
define ("FBAUTH_STATUS_NOTPLUGGED",200); // This key is not plugged in the computer
|
|
|
|
|
|
/**
|
|
* Return the text corresponding to the integer status of a key
|
|
*
|
|
* @param status The status
|
|
* @return The text corresponding to the status
|
|
* @access public
|
|
*/
|
|
function FbAuth_GetStatusStr($status)
|
|
{
|
|
switch($status)
|
|
{
|
|
case FBAUTH_STATUS_OK : return 'OK';
|
|
case FBAUTH_STATUS_NOT_FOUND : return 'Key does not exist in the db';
|
|
case FBAUTH_STATUS_INACTIVE : return 'Key not activated';
|
|
case FBAUTH_STATUS_LOST : return 'Key was lost';
|
|
case FBAUTH_STATUS_STOLLEN : return 'Key was stollen';
|
|
case FBAUTH_STATUS_FEE_DUE : return 'The annual fee was not paid';
|
|
case FBAUTH_STATUS_OBSOLETE : return 'Key no longer supported';
|
|
case FBAUTH_STATUS_REPLACED : return 'This key has been replaced by a backup key';
|
|
case FBAUTH_STATUS_BACKUP_KEY : return 'This key is a backup key that is not activated yet';
|
|
case FBAUTH_STATUS_NOTPLUGGED : return 'This key is not plugged in the computer';
|
|
case FBAUTH_STATUS_UNKOWN : return 'Unknow Status, could not connect to the authentication server';
|
|
}
|
|
return 'unknown status '.$status;
|
|
}
|
|
|
|
/**
|
|
* If your web site requires a key to login you should check that the key
|
|
* is still valid (has not been lost or stolen) before requiring it.
|
|
* A key can be authenticated only if its status is FBAUTH_STATUS_OK
|
|
* @param fbid The id of the feebee
|
|
* @return The status of the feebee
|
|
* @access public
|
|
*/
|
|
function FbAuth_GetStatus($fbid)
|
|
{
|
|
global $http_response_header;
|
|
$res = file_get_contents('http://auth-status.musbe.net/GET-STATUS/'.$fbid);
|
|
|
|
$err = substr($http_response_header[0], 9, 3); //HTTP/1.0
|
|
if ($err == "200")
|
|
return intval($res);
|
|
|
|
// in case of connection failure we return OK but it should never occurd
|
|
return FBAUTH_STATUS_UNKOWN;
|
|
}
|
|
|
|
|
|
?>
|