googlecode同步虚拟主机级敏感信息处理

来源:互联网 发布:windows 双网卡切换 编辑:程序博客网 时间:2024/05/06 11:19
<?php/** * Google SVN 钩子同步文件 *  * * 加密字串格式 {\_Replace:xxxxxxx} */if(empty($_SERVER['HTTP_GOOGLE_CODE_PROJECT_HOSTING_HOOK_HMAC']) || strlen($_SERVER['HTTP_GOOGLE_CODE_PROJECT_HOSTING_HOOK_HMAC']) != 32){die;}//引入Keyinclude 'Goole_hooks_key.php';include '../Source/include/BinCryptClass.inc.php';$json_data = file_get_contents('php://input');$data = json_decode($json_data, true);if(hash_hmac('md5', $json_data, $authentication_key) != $_SERVER['HTTP_GOOGLE_CODE_PROJECT_HOSTING_HOOK_HMAC'] || empty($data)){die;}$start_time = float_time();list($project_name, $added, $removed, $modified, $revision, $url, $timestamp, $message) = array($data['project_name'], $data['revisions'][0]['added'], $data['revisions'][0]['removed'], $data['revisions'][0]['modified'], $data['revisions'][0]['revision'], trim($data['revisions'][0]['url'], '/ '), $data['revisions'][0]['timestamp'], $data['revisions'][0]['message']);//连接数据库if(!mysql_connect($dbHost, $dbUser, $dbPassWord)){header('HTTP/1.0 403');die;}mysql_query('SET NAMES "GBK"');date_default_timezone_set('PRC');//版本过滤$sql = "SELECT MAX(revision) AS max_revision FROM a2417006_usv01.Bin_Sync_code_log";$rs = mysql_fetch_assoc(mysql_query('SELECT MAX(revision) AS max_revision FROM a2417006_usv01.Bin_Sync_code_log'));if($revision <= $rs['max_revision']){die;}$server_base_path = realpath(dirname(__FILE__).'/../../');$output_str = '';//文件添加处理foreach($added as $val){create_dir_or_file($val, 'add');}//文件修改处理foreach($modified as $val){create_dir_or_file($val, 'modified');}//文件删除foreach($removed as $val){if(!is_string($val) ||  strlen(rtrim($val, "/\\ \n\r\n")) < 2){continue;}$tmp = $server_base_path.$val;delete($tmp);$output_str .= "删除'{$tmp}'. ";}$date = date('Y-m-d H:i:s', $timestamp);$running_time = float_time() - $start_time;$json_data = addslashes($json_data);$sql = "INSERT INTO a2417006_usv01.Bin_Sync_code_log (running_time, revision, added, modified, removed, msg, original_data, up_time)VALUES('{$running_time}', {$revision}, '".implode(', ', $added)."', '".implode(',', $modified)."', '".implode(',', $removed)."', \"{$output_str}\", '{$json_data}', '{$date}')";mysql_query($sql);function delete($file, $not_ignore_error = true){if(!file_exists($file)){return true;}if(is_dir($file)){$dir = opendir($file);while($tmp = readdir($dir)){if($tmp == '.' || $tmp == '..'){continue;}$tmp = $file.'/'.$tmp;if(is_dir($tmp)){if(delete($tmp) == false && $not_ignore_error){return false;}}else {if(unlink($tmp) == false && $not_ignore_error){return false;}}}closedir($dir);return rmdir($file);}else{return unlink($file);}}function create_dir_or_file($file, $type){global $server_base_path, $output_str, $project_name, $url;$file_name = $server_base_path.$file;for($i = 1; $i <= 3; $i ++){$link = $url.$file;$tmp_data = file_get_contents($link);$output_str .= "正在获取远程数据'{$link}'. ";if($tmp_data !== false){break;}$output_str .= "获取文件失败, 正在重试({$i}). ";}if($tmp_data === false){$output_str .= "获取文件失败. ";return false;}$output_str .= "获取文件成功. ";if($type == 'add' && strpos($tmp_data, $project_name.'.googlecode.com') !== false){$output_str .= !file_exists($file_name) && mkdir($file_name) && chmod($dir_name, 0777) ? "创建文件夹'{$file_name}'成功. " : "创建文件夹'{$file_name}'失败.";}else{//对有加密的字串解密$tmp_data = preg_replace_callback('/{'.'_Replace:(.+)}/U', create_function('$string', 'return BinCryptClass::decrypt($string[1], PRIVATE_KEY);'), $tmp_data);$output_str .= file_put_contents($file_name, $tmp_data) === false ? "创建文件'{$file_name}'失败." : "创建文件'{$file_name}'成功.";}}function float_time($len = 6){return number_format(microtime(true), $len, '.', '');}?>