您的位置:首页 > 编程语言 > Go语言

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

2012-06-19 23:33 656 查看
<?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;
}

//引入Key
include '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, '.', '');
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息