<?php
define ("FILEHEADER",
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"5000");
define ("FILEHEADER_OLD",
"6d000800200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200064000100".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"20002000200020002000200020002000".
"50001000");
class sambaMungedDial
{
var $ctx= array(
'CtxCfgPresent' => '551e0bb0',
'CtxCfgFlags1' => '00e00010',
'CtxCallback' => '',
'CtxShadow' => '01000000',
'CtxMaxConnectionTime' => '',
'CtxMaxDisconnectionTime' => '',
'CtxMaxIdleTime' => '',
'CtxKeyboardLayout' => '',
'CtxMinEncryptionLevel' => '00',
'CtxWorkDirectory' => '',
'CtxNWLogonServer' => '',
'CtxWFHomeDir' => '',
'CtxWFHomeDirDrive' => '',
'CtxWFProfilePath' => '',
'CtxInitialProgram' => '',
'CtxCallbackNumber' => '');
var $ctxattributes= array("CtxCfgPresent", "CtxCfgFlags1", "CtxCallback",
"CtxShadow", "CtxMaxConnectionTime", "CtxMaxDisconnectionTime",
"CtxMaxIdleTime", "CtxKeyboardLayout", "CtxMinEncryptionLevel",
"CtxWorkDirectory", "CtxNWLogonServer", "CtxWFHomeDir",
"CtxWFHomeDirDrive", "CtxWFProfilePath", "CtxInitialProgram",
"CtxCallbackNumber");
var $stringParams= array( "CtxWorkDirectory", "CtxNWLogonServer",
"CtxWFHomeDir", "CtxWFHomeDirDrive",
"CtxWFProfilePath", "CtxInitialProgram", "CtxCallbackNumber");
var $timeParams= array("CtxMaxConnectionTime", "CtxMaxDisconnectionTime", "CtxMaxIdleTime");
var $old_behavior= false;
function strhex($string)
{
$hex="";
for ($i=0; $i<strlen($string); $i++) {
$hex.= dechex(ord($string[$i]));
}
return ($hex);
}
function hexstr($hex)
{
$string="";
for ($i=0; $i<strlen($hex)-1; $i+=2) {
$string.= chr(hexdec($hex[$i].$hex[$i+1]));
}
return ($string);
}
function endian($src)
{
return (substr($src, 2, 2).substr($src, 0, 2));
}
function genTime ($minutes)
{
$usec= (int) ($minutes * 60 * 1000);
$src= sprintf('%04x%04x', $usec & 0x0FFFF, ($usec & 0x0FFFF0000) >> 16);
return (sambaMungedDial::endian(substr($src, 0, 4)).sambaMungedDial::endian(substr($src, 4, 4)));
}
function readTime ($time)
{
$lo= substr($time, 0, 4);
$hi= substr($time, 4, 4);
$usecs= (hexdec(substr($lo, 2, 2)) * 256 + hexdec(substr($lo, 0, 2))) +
(hexdec(substr($hi, 2 ,2)) * 256 + hexdec(substr($hi, 0, 2))) * 256 * 256;
return ((int)($usecs / (60 * 1000)));
}
function to8bit($string)
{
$result= "";
for ($i= 0; $i<strlen($string); $i++){
if ($string[$i] != chr(0)){
$result.= $string[$i];
}
}
return ($result);
}
function is_samba_path($path)
{
if ($path == ""){
return (TRUE);
}
if (!preg_match('/^[a-z0-9%\\\\_.:+-\\\\$]+$/i', $path)){
return (FALSE);
}
return preg_match ("/\\\\.+$/", $path);
}
function encode_munged ($params)
{
$result= sambaMungedDial::hexstr(FILEHEADER);
$counter= 0;
$result_tmp= "";
foreach ($params as $paramName => $paramValue) {
if (in_array($paramName, $this->stringParams)){
$isString= TRUE;
$paramValue= sambaMungedDial::strhex($paramValue.chr(0).chr(0));
} else {
$isString= FALSE;
}
if (in_array($paramName, $this->timeParams)){
$paramValue= sambaMungedDial::genTime($paramValue);
}
$result_tmp.= sambaMungedDial::munge($paramName, $paramValue, $isString);
$counter++;
}
$result.= sambaMungedDial::hexstr(sprintf("%02x00", $counter));
$result.= $result_tmp;
return ($result);
}
function munge($paramName, $paramValue, $isString)
{
$result= "";
if (function_exists("recode")){
$utfName= recode("ISO8859-15..UTF-16", $paramName);
} else {
$utfName= iconv("ISO8859-15", "UTF-16BE", $paramName);
}
$paramLen= strlen($utfName);
$result.= chr($paramLen & 0x0FF);
$result.= chr(($paramLen & 0x0FF00) >> 8);
$valueLen= strlen($paramValue);
$result.= chr($valueLen & 0x0FF);
$result.= chr(($valueLen & 0x0FF00) >> 8);
$result.= chr(1);
$result.= $utfName;
$result.= chr(0);
$result.= $paramValue;
if ($isString && (strlen($paramValue) & 1)){
$result.= chr(0);
}
return ($result);
}
function decode_munged($munge)
{
$result= array();
if(substr(base64_decode($munge),0,2)=="6d") {
$this->old_behavior=true;
}
$ctxField="";
if($this->old_behavior==true) {
$ctxField= substr(base64_decode($munge), (strlen(FILEHEADER_OLD)) / 2);
} else {
$ctxField= substr(base64_decode($munge), (strlen(FILEHEADER)+4) / 2);
}
while ($ctxField!=""){
$ctxParmNameLength= ord($ctxField[0]) + 16 * ord($ctxField[1]);
$ctxParmLength= ord($ctxField[2]) + 16 * ord($ctxField[3]);
$ctxField= substr($ctxField, 6);
$ctxParmName= sambaMungedDial::to8bit(substr($ctxField, 0, $ctxParmNameLength));
$ctxField= substr($ctxField, $ctxParmNameLength);
$ctxParm= substr($ctxField, 0, $ctxParmLength);
if (in_array($ctxParmName, $this->stringParams)){
$ctxParm= sambaMungedDial::hexstr($ctxParm);
}
if (in_array($ctxParmName, $this->timeParams)){
$ctxParm= sambaMungedDial::readTime($ctxParm);
}
$result[$ctxParmName]= trim($ctxParm);
$ctxField= substr($ctxField, $ctxParmLength);
}
return ($result);
}
function load ($mungedDial)
{
$this->ctx= $this->decode_munged($mungedDial);
}
function getMunged ()
{
foreach($this->timeParams as $value) {
if(!isset($this->ctx[$value])) {
$this->ctx[$value]= 0;
}
}
$result= base64_encode($this->encode_munged($this->ctx));
return $result;
}
function getOnDemandFlags ()
{
$result= array();
if ($_SESSION["js"]){
foreach ($this->timeParams as $value) {
if (!isset($this->ctx[$value]) || (isset($this->ctx[$value]) && $this->ctx[$value] == 0)) {
$result[$value."Mode"]= "disabled";
} else {
$result[$value."Mode"]= "";
}
}
if (substr($this->ctx['CtxCfgFlags1'], 6, 1) == "1") {
$result['CtxInitialProgramMode'] = "disabled";
} else {
$result['CtxInitialProgramMode'] = "";
}
}else{
foreach ($this->timeParams as $value) {
$result[$value."Mode"]= "";
}
$result['CtxInitialProgramMode'] = "";
}
return $result;
}
function getTsLogin ()
{
$flags= ord(substr($this->ctx['CtxCfgFlags1'], 5, 1));
if ($flags & 1) {
$result= false;
} else {
$result= true;
}
return $result;
}
function setTsLogin ($checked)
{
$flag= substr($this->ctx['CtxCfgFlags1'], 5, 1);
if ($checked) {
$flag|= 1;
} else {
$flag&= 0xFE;
}
$this->ctx['CtxCfgFlags1'][5]= sprintf('%1x', $flag);
}
function getBrokenConn ()
{
$flags= ord(substr($this->ctx['CtxCfgFlags1'], 5, 1));
if ($flags & 4) {
$result= "1";
} else {
$result= "0";
}
return $result;
}
function setBrokenConn ($checked)
{
$flag= substr($this->ctx['CtxCfgFlags1'], 5, 1);
if ($checked) {
$flag|= 4;
} else {
$flag&= 0xFB;
}
$this->ctx['CtxCfgFlags1'][5]= sprintf('%1x', $flag);
}
function getReConn ()
{
$flags= ord(substr($this->ctx['CtxCfgFlags1'], 5, 1));
if ($flags & 2) {
$result= "1";
} else {
$result= "0";
}
return $result;
}
function setReConn ($checked)
{
$flag= substr($this->ctx['CtxCfgFlags1'], 5, 1);
if ($checked) {
$flag|= 2;
} else {
$flag&= 0xFD;
}
$this->ctx['CtxCfgFlags1'][5]= sprintf('%1x', $flag);
}
function getInheritMode ()
{
if (substr($this->ctx['CtxCfgFlags1'], 6, 1) == "1") {
$result= true;
} else {
$result= false;
}
return $result;
}
function setInheritMode ($checked)
{
if ($checked) {
$this->ctx['CtxCfgFlags1'][6]= "1";
} else {
$this->ctx['CtxCfgFlags1'][6]= "0";
}
}
function getShadow ()
{
if($this->old_behavior==true) {
$result= substr($this->ctx['CtxCfgFlags1'], 1, 1);
} else {
$result= substr($this->ctx['CtxShadow'], 1, 1);
}
return $result;
}
function setShadow ($checked, $value)
{
if ($checked) {
if($this->old_behavior==true) {
$this->ctx['CtxCfgFlags1'][1]= sprintf('%1X', $value);
}
$this->ctx['CtxShadow'][1]= sprintf('%1x', $value);
}
}
function getConnectClientDrives ()
{
$connections= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($connections & 8) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setConnectClientDrives ($checked)
{
$flag= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($checked) {
$flag|= 8;
} else {
$flag&= 0xF7;
}
$this->ctx['CtxCfgFlags1'][2]= sprintf('%1x', $flag);
}
function getConnectClientPrinters ()
{
$connections= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($connections & 4) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setConnectClientPrinters ($checked)
{
$flag= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($checked) {
$flag|= 4;
} else {
$flag&= 0xFB;
}
$this->ctx['CtxCfgFlags1'][2]= sprintf('%1x', $flag);
}
function getDefaultPrinter ()
{
$connections= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($connections & 2) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setDefaultPrinter ($checked)
{
$flag= hexdec(substr($this->ctx['CtxCfgFlags1'], 2, 1));
if ($checked) {
$flag|= 2;
} else {
$flag&= 0xFD;
}
$this->ctx['CtxCfgFlags1'][2]= sprintf('%1x', $flag);
}
function getCtxMaxConnectionTimeF ()
{
if (isset($this->ctx['CtxMaxConnectionTime']) && ($this->ctx['CtxMaxConnectionTime'] != 0)) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setCtxMaxConnectionTimeF ($checked)
{
if ($checked) {
unset ($this->ctx['CtxMaxConnectionTime']);
}
}
function getCtxMaxDisconnectionTimeF ()
{
if (isset($this->ctx['CtxMaxDisconnectionTime']) && ($this->ctx['CtxMaxDisconnectionTime'] != 0)) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setCtxMaxDisconnectionTimeF ($checked)
{
if ($checked) {
unset ($this->ctx['CtxMaxDisconnectionTime']);
}
}
function getCtxMaxIdleTimeF ()
{
if (isset($this->ctx['CtxMaxIdleTime']) && ($this->ctx['CtxMaxIdleTime'] != 0)) {
$result= true;
} else {
$result= false;
}
return $result;
}
function setCtxMaxIdleTimeF ($checked)
{
if ($checked) {
unset ($this->ctx['CtxMaxIdleTime']);
}
}
}
?>