| 
<?phpnamespace Jackbooted\Security;
 
 use \Jackbooted\Forms\Request;
 use \Jackbooted\G;
 use \Jackbooted\Html\JS;
 use \Jackbooted\Util\Log4PHP;
 /**
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
 *
 * Written by Brett Dutton of Jackbooted Software
 * brett at brettdutton dot com
 *
 * This software is written and distributed under the GNU General Public
 * License which means that its source code is freely-distributed and
 * available to the general public.
 */
 
 /**
 * This class generates an encripted key that is used by API calls
 * It is limited to certain length of time, and locked into a user
 */
 class TimeGuard extends \Jackbooted\Util\JB {
 const KEY = '_TG';
 const DELIM = '*,*';
 const NOGUARD = 'NO_TIME_GUARD';
 const EXPIRY = 86400; // 60 * 60 * 24; // One Day
 
 private static $log;
 private static $crypto;
 
 public static function init () {
 self::$log = Log4PHP::logFactory ( __CLASS__ );
 self::$crypto = new Cryptography ();
 }
 
 public function __construct () {
 parent::__construct();
 }
 
 public static function get ( $targetFile, $forceEncrypt=true ) {
 $unencryptedKey = join ( self::DELIM,  [ G::get ( 'fldUser', 'GUEST' ),
 $_SERVER['HTTP_HOST'],
 $_SERVER['HTTP_USER_AGENT'],
 session_id (),
 $targetFile,
 time ()  ] );
 return self::$crypto->encrypt ( $unencryptedKey, $forceEncrypt );
 }
 
 public static function js ( $targetFile ) {
 $param = self::param ( $targetFile );
 
 return JS::javaScript ( "var tgUrlParam = '$param';" );
 }
 
 public static function url ( $targetFile, $forceEncrypt=true ) {
 return $targetFile . '?' . self::param ( $targetFile, $forceEncrypt );
 }
 
 public static function param ( $targetFile, $forceEncrypt=true ) {
 $key = self::KEY;
 $u = self::get ( $targetFile, $forceEncrypt );
 $val = urlencode ( $u );
 return $key . '=' . $val;
 }
 
 public static function check () {
 if ( ( $val = Request::get ( self::KEY ) ) == '' ) {
 return self::NOGUARD;
 }
 else {
 $values = explode ( self::DELIM, $val );
 if ( count ( $values ) != 6 ) {
 return 'Incorrect TimeGuard format';
 }
 else if ( $values[0] != G::get ( 'fldUser', 'GUEST' ) ) {
 return 'The user has changed in the submission of this url';
 }
 else if ( $values[1] != $_SERVER['HTTP_HOST'] ) {
 return 'Host server has been compromised';
 }
 else if ( $values[2] != $_SERVER['HTTP_USER_AGENT'] ) {
 return 'Browser has been compromised';
 }
 else if ( $values[3] != session_id () ) {
 return 'PHP Session ID has been compromised';
 }
 else if ( strpos ( $_SERVER['SCRIPT_NAME'], $values[4] ) === false ) {
 return 'URL has been reused for target file name';
 }
 else {
 $diff = time () - $values[5];
 if ( $diff < 0 || $diff > self::EXPIRY ) {
 return 'URL has expired';
 }
 else {
 return true;
 }
 }
 }
 }
 }
 |