分类: 系统运维
2009-08-22 15:21:30
uc_client的主要功能是对UCHome用户的处理,包括:登录、注册、删除等。
uc_client的文件结构
/control 控制文件
/data 一些信息的缓存
/lib 要用到的一些类文件
/model 直接对数据库进行操作
因为uc_client,只是一个接口,让uchome或是bbs来调用,所以他没有MVC中的V。
首先我对uc_client的引入文件开始分析:client.php 文件进行分析 通过这个文件,处理不同的关于用户的信息操作
0001.0002. 0003./**0004. * 文件名称:client.php0005. * 功能:通过调用这个文件的不同函数,寻找不同的控制器与不同的方法0006. *0007. * @copyright 2009 ymaozi Site:www.codedesign.cn0008. * QQ群:834001730009. * 分析时间:2009-6-70010. */0011. 0012.if(!defined('UC_API')) {0013. exit('Access dened');0014.} //是否定义UC_API,在config.php定义的是ucenter的url0015. 0016.error_reporting(0); //屏蔽所有的错误0017. 0018.define('IN_UC', TRUE); //定义IN_UC,以防直接访问控制文件0019.define('UC_CLIENT_VERSION', '1.5.0'); //定义版本0020.define('UC_CLIENT_RELEASE', '20081212'); //定义版本更新时间0021.define('UC_ROOT', substr(__FILE__, 0, -10)); //note 用户中心客户端的根目录 UC_CLIENTROOT0022.define('UC_DATADIR', UC_ROOT.'./data/'); //note 用户中心的数据缓存目录0023.define('UC_DATAURL', UC_API.'/data'); //note 用户中心的数据 URL0024.define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post'); //如果数据库是mysql则执行uc_api_mysql()函数,否则则执行uc_api_post0025.$GLOBALS['uc_controls'] = array(); //定义一全局数组0026./**0027. * 在执行sql语句时,在需要在某些字符前加上了反斜线,这些字符有单引号(')、双引号(")、反斜线(\)0028. *0029. * @param string/array $string 如果$string 为字符串,则直接用转换,如果是数组的话,通过foreach循环遂个进行转换0030. * @param bool $force0031. * @param bool $strip0032. * @return string0033. * get_magic_quotes_gpc():本函式取得 PHP 环境设定的变数 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。如果传回0为关闭,1为打开0034. * string addslashes(string str) 在某些字符前加上了反斜线0035. * string stripslashes (string str) 将用addslashes()函数处理后的字符串返回原样。0036. */"more-11">0037.function uc_addslashes($string, $force = 0, $strip = FALSE) {0038. !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); //是否定义MAGIC_QUOTES_GPC,没有的话就定义0039. if(!MAGIC_QUOTES_GPC || $force) {0040. if(is_array($string)) {0041. foreach($string as $key => $val) {0042. $string[$key] = uc_addslashes($val, $force, $strip);0043. }0044. } else {0045. $string = addslashes($strip ? stripslashes($string) : $string);0046. }0047. }0048. return $string;0049.}0050.//判断是否存在daddslashes函数,如果不存在则定义0051.if(!function_exists('daddslashes')) {0052. 0053. /**0054. * 在需要在某些字符前加上了反斜线0055. *0056. * @param string $string0057. * @param bool $force0058. * @return string0059. */0060. function daddslashes($string, $force = 0) {0061. return uc_addslashes($string, $force);0062. }0063.}0064. 0065./**0066. * 将用addslashes()函数处理后的字符串返回原样0067. *0068. * @param string $string0069. * @return string0070. */0071.function uc_stripslashes($string) {0072. !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());0073. if(MAGIC_QUOTES_GPC) {0074. return stripslashes($string);0075. } else {0076. return $string;0077. }0078.}0079. 0080./**0081. * dfopen 方式取指定的模块和动作的数据0082. *0083. * @param string $module 请求的模块0084. * @param string $action 请求的动作0085. * @param array $arg 参数(会加密的方式传送)0086. * @return string0087. */0088.function uc_api_post($module, $action, $arg = array()) {0089. $s = $sep = '';0090. foreach($arg as $k => $v) {0091. $k = urlencode($k);0092. if(is_array($v)) {0093. $s2 = $sep2 = '';0094. foreach($v as $k2 => $v2) {0095. $k2 = urlencode($k2);0096. $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));0097. $sep2 = '&';0098. }0099. $s .= $sep.$s2;0100. } else {0101. $s .= "$sep$k=".urlencode(uc_stripslashes($v));0102. }0103. $sep = '&';0104. }0105. $postdata = uc_api_requestdata($module, $action, $s);0106. return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);0107.}0108. 0109./**0110. * 构造发送给用户中心的请求数据0111. *0112. * @param string $module 请求的模块0113. * @param string $action 请求的动作0114. * @param string $arg 参数(会加密的方式传送)0115. * @param string $extra 附加参数(传送时不加密)0116. * @return string0117. */0118.function uc_api_requestdata($module, $action, $arg='', $extra='') {0119. $input = uc_api_input($arg);0120. $post = "m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra;0121. return $post;0122.}0123. 0124.function uc_api_url($module, $action, $arg='', $extra='') {0125. $url = UC_API.'/index.php?'.uc_api_requestdata($module, $action, $arg, $extra);0126. return $url;0127.}0128. 0129.function uc_api_input($data) {0130. $s = urlencode(uc_authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', UC_KEY));0131. return $s;0132.}0133. 0134./**0135. * MYSQL 方式取指定的模块和动作的数据0136. *0137. * @param string $model 请求的模块0138. * @param string $action 请求的动作0139. * @param string $args 参数(会加密的方式传送)0140. * @return mix0141. */0142.function uc_api_mysql($model, $action, $args=array()) {0143. global $uc_controls;0144. if(empty($uc_controls[$model])) {0145. include_once UC_ROOT.'./lib/db.class.php';0146. include_once UC_ROOT.'./model/base.php';0147. include_once UC_ROOT."./control/$model.php";0148. eval("\$uc_controls['$model'] = new {$model}control();");0149. }0150. if($action{0} != '_') {0151. $args = uc_addslashes($args, 1, TRUE);0152. $action = 'on'.$action;0153. 0154. $uc_controls[$model]->input = $args;0155. return $uc_controls[$model]->$action($args);0156. } else {0157. return '';0158. }0159.}0160. 0161./**0162. * 将数组转换成xml0163. *0164. * @param arrau $arr0165. * @param bool $htmlon0166. * @return string0167. */0168.function uc_serialize($arr, $htmlon = 0) {0169. include_once UC_ROOT.'./lib/xml.class.php';0170. return xml_serialize($arr, $htmlon);0171.}0172. 0173./**0174. * 将xml转换成为数组0175. *0176. * @param stromg $s0177. * @return array0178. */0179.function uc_unserialize($s) {0180. include_once UC_ROOT.'./lib/xml.class.php';0181. return xml_unserialize($s);0182.}0183. 0184./**0185. * 字符串加密以及解密函数0186. *0187. * @param string $string 原文或者密文0188. * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE0189. * @param string $key 密钥0190. * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效0191. * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文0192. *0193. * @example0194. *0195. * $a = authcode('abc', 'ENCODE', 'key');0196. * $b = authcode($a, 'DECODE', 'key'); // $b(abc)0197. *0198. * $a = authcode('abc', 'ENCODE', 'key', 3600);0199. * $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空0200. */0201.function uc_authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {0202. 0203. $ckey_length = 4; //note 随机密钥长度 取值 0-32;0204. //note 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。0205. //note 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方0206. //note 当此值为 0 时,则不产生随机密钥0207. 0208. $key = md5($key ? $key : UC_KEY);0209. $keya = md5(substr($key, 0, 16));0210. $keyb = md5(substr($key, 16, 16));0211. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';0212. 0213. $cryptkey = $keya.md5($keya.$keyc);0214. $key_length = strlen($cryptkey);0215. 0216. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;0217. $string_length = strlen($string);0218. 0219. $result = '';0220. $box = range(0, 255);0221. 0222. $rndkey = array();0223. for($i = 0; $i <= 255; $i++) {0224. $rndkey[$i] = ord($cryptkey[$i % $key_length]);0225. }0226. 0227. for($j = $i = 0; $i < 256; $i++) {0228. $j = ($j + $box[$i] + $rndkey[$i]) % 256;0229. $tmp = $box[$i];0230. $box[$i] = $box[$j];0231. $box[$j] = $tmp;0232. }0233. 0234. for($a = $j = $i = 0; $i < $string_length; $i++) {0235. $a = ($a + 1) % 256;0236. $j = ($j + $box[$a]) % 256;0237. $tmp = $box[$a];0238. $box[$a] = $box[$j];0239. $box[$j] = $tmp;0240. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));0241. }0242. 0243. if($operation == 'DECODE') {0244. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {0245. return substr($result, 26);0246. } else {0247. return '';0248. }0249. } else {0250. return $keyc.str_replace('=', '', base64_encode($result));0251. }0252.}0253. 0254./**0255. * 远程打开URL0256. * @param string $url 打开的url, 如 0257. * @param int $limit 取返回的数据的长度0258. * @param string $post 要发送的 POST 数据,如uid=1&password=12340259. * @param string $cookie 要模拟的 COOKIE 数据,如uid=123&auth=a2323sd23230260. * @param bool $bysocket TRUE/FALSE 是否通过SOCKET打开0261. * @param string $ip IP地址0262. * @param int $timeout 连接超时时间0263. * @param bool $block 是否为阻塞模式0264. * @return 取到的字符串0265. */0266.function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {0267. $__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;0268. if($__times__ > 2) {0269. return '';0270. }0271. $url .= (strpos($url, '?') === FALSE ? '?' : '&')."__times__=$__times__";0272. return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block);0273.}0274. 0275.function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {0276. $return = '';0277. $matches = parse_url($url);0278. !isset($matches['host']) && $matches['host'] = '';0279. !isset($matches['path']) && $matches['path'] = '';0280. !isset($matches['query']) && $matches['query'] = '';0281. !isset($matches['port']) && $matches['port'] = '';0282. $host = $matches['host'];0283. $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';0284. $port = !empty($matches['port']) ? $matches['port'] : 80;0285. if($post) {0286. $out = "POST $path HTTP/1.0\r\n";0287. $out .= "Accept: */*\r\n";0288. //$out .= "Referer: $boardurl\r\n";0289. $out .= "Accept-Language: zh-cn\r\n";0290. $out .= "Content-Type: application/x-www-form-urlencoded\r\n";0291. $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";0292. $out .= "Host: $host\r\n";0293. $out .= 'Content-Length: '.strlen($post)."\r\n";0294. $out .= "Connection: Close\r\n";0295. $out .= "Cache-Control: no-cache\r\n";0296. $out .= "Cookie: $cookie\r\n\r\n";0297. $out .= $post;0298. } else {0299. $out = "GET $path HTTP/1.0\r\n";0300. $out .= "Accept: */*\r\n";0301. //$out .= "Referer: $boardurl\r\n";0302. $out .= "Accept-Language: zh-cn\r\n";0303. $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";0304. $out .= "Host: $host\r\n";0305. $out .= "Connection: Close\r\n";0306. $out .= "Cookie: $cookie\r\n\r\n";0307. }0308. $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);0309. if(!$fp) {0310. return '';//note $errstr : $errno \r\n0311. } else {0312. stream_set_blocking($fp, $block);0313. stream_set_timeout($fp, $timeout);0314. @fwrite($fp, $out);0315. $status = stream_get_meta_data($fp);0316. if(!$status['timed_out']) {0317. while (!feof($fp)) {0318. if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {0319. break;0320. }0321. }0322. 0323. $stop = false;0324. while(!feof($fp) && !$stop) {0325. $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));0326. $return .= $data;0327. if($limit) {0328. $limit -= strlen($data);0329. $stop = $limit <= 0;0330. }0331. }0332. }0333. @fclose($fp);0334. return $return;0335. }0336.}0337. 0338.function uc_app_ls() {0339. $return = call_user_func(UC_API_FUNC, 'app', 'ls', array());0340. return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);0341.}0342. 0343./**0344. * 添加 feed0345. *0346. * @param string $icon 图标0347. * @param string $uid uid0348. * @param string $username 用户名0349. * @param string $title_template 标题模板0350. * @param array $title_data 标题内容0351. * @param string $body_template 内容模板0352. * @param array $body_data 内容内容0353. * @param string $body_general 保留0354. * @param string $target_ids 保留0355. * @param array $images 图片0356. * 格式为:0357. * array(0358. * array('url'=>'', 'link'=>''),0359. * array('url'=>'', 'link'=>''),0360. * array('url'=>'', 'link'=>''),0361. * )0362. * 示例:0363. * $feed['images'][] = array('url'=>$vthumb1, 'link'=>$vthumb1);0364. * $feed['images'][] = array('url'=>$vthumb2, 'link'=>$vthumb2);0365. * @return int feedid0366. */0367.function uc_feed_add($icon, $uid, $username, $title_template='', $title_data='', $body_template='', $body_data='', $body_general='', $target_ids='', $images = array()) {0368. return call_user_func(UC_API_FUNC, 'feed', 'add',0369. array( 'icon'=>$icon,0370. 'appid'=>UC_APPID,0371. 'uid'=>$uid,0372. 'username'=>$username,0373. 'title_template'=>$title_template,0374. 'title_data'=>$title_data,0375. 'body_template'=>$body_template,0376. 'body_data'=>$body_data,0377. 'body_general'=>$body_general,0378. 'target_ids'=>$target_ids,0379. 'image_1'=>$images[0]['url'],0380. 'image_1_link'=>$images[0]['link'],0381. 'image_2'=>$images[1]['url'],0382. 'image_2_link'=>$images[1]['link'],0383. 'image_3'=>$images[2]['url'],0384. 'image_3_link'=>$images[2]['link'],0385. 'image_4'=>$images[3]['url'],0386. 'image_4_link'=>$images[3]['link']0387. )0388. );0389.}0390. 0391./**0392. * 每次取多少条0393. *0394. * @param int $limit0395. * @return array()0396. */0397.function uc_feed_get($limit = 100, $delete = TRUE) {0398. $return = call_user_func(UC_API_FUNC, 'feed', 'get', array('limit'=>$limit, 'delete'=>$delete));0399. return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);0400.}0401. 0402./**0403. * 添加好友0404. *0405. * @param int $uid 用户ID0406. * @param int $friendid 好友ID0407. * @return0408. * >0 成功0409. * <=0 失败0410. */0411.function uc_friend_add($uid, $friendid, $comment='') {0412. return call_user_func(UC_API_FUNC, 'friend', 'add', array('uid'=>$uid, 'friendid'=>$friendid, 'comment'=>$comment));0413.}0414. 0415./**0416. * 删除好友0417. *0418. * @param int $uid 用户ID0419. * @param array $friendids 好友ID0420. * @return0421. * >0 成功0422. * <=0 失败,或者好友已经删除0423. */0424.function uc_friend_delete($uid, $friendids) {0425. return call_user_func(UC_API_FUNC, 'friend', 'delete', array('uid'=>$uid, 'friendids'=>$friendids));0426.}0427. 0428./**0429. * 好友总数0430. * @param int $uid 用户ID0431. * @return int0432. */0433.function uc_friend_totalnum($uid, $direction = 0) {0434. return call_user_func(UC_API_FUNC, 'friend', 'totalnum', array('uid'=>$uid, 'direction'=>$direction));0435.}0436. 0437./**0438. * 好友列表0439. *0440. * @param int $uid 用户ID0441. * @param int $page 当前页0442. * @param int $pagesize 每页条目数0443. * @param int $totalnum 总数0444. * @param int $direction 默认为正向. 正向:1 , 反向:2 , 双向:30445. * @return array0446. */0447.function uc_friend_ls($uid, $page = 1, $pagesize = 10, $totalnum = 10, $direction = 0) {0448. $return = call_user_func(UC_API_FUNC, 'friend', 'ls', array('uid'=>$uid, 'page'=>$page, 'pagesize'=>$pagesize, 'totalnum'=>$totalnum, 'direction'=>$direction));0449. return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);0450.}0451. 0452./**0453. * 用户注册0454. *0455. * @param string $username 用户名0456. * @param string $password 密码0457. * @param string $email Email0458. * @param int $questionid 安全提问0459. * @param string $answer 安全提问答案0460. * @return int0461. -1 : 用户名不合法0462. -2 : 包含不允许注册的词语0463. -3 : 用户名已经存在0464. -4 : email 格式有误0465. -5 : email 不允许注册0466. -6 : 该 email 已经被注册0467. >1 : 表示成功,数值为 UID0468.*/0469.function uc_user_register($username, $password, $email, $questionid = '', $answer = '') {0470. return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer));0471.}0472. 0473./**0474. * 用户注册0475. *0476. * @param string $username 用户名0477. * @param string $password 密码0478. * @param string $email Email0479. * @param int $questionid 安全提问0480. * @param string $answer 安全提问答案0481. * @return int0482. -1 : 用户名不合法0483. -2 : 包含不允许注册的词语0484. -3 : 用户名已经存在0485. -4 : email 格式有误0486. -5 : email 不允许注册0487. -6 : 该 email 已经被注册0488. >1 : 表示成功,数值为 UID0489. 0490.function uc_ef007_register($username, $password, $email, $usertype) {0491. return
call_user_func(UC_API_FUNC, 'user', 'register',
array('username'=>$username, 'password'=>$password,
'email'=>$email, 'questionid'=>$questionid,
'answer'=>$answer,'usertype'=>$usertype));0492.}0493./**0494. * 中介机构注册0495. *0496. * @param int $city0497. * @param string $companyName0498. * @param string $companyEmailk0499. * @param string $contactTel0500. * @param string $contactPerson0501. * @param string $companyAddress0502. * @param int $companyNo 工商注册号0503. * @param int $companyRegCount 注册资本0504. * @param string $companyRegDate0505. * @param int $companyUnit0506. * @param string $companyInfo0507. * @param string $companyRemark0508. *0509. * @return int0510. * -1 : 用户名不合法0511. * >1 : 表示成功,数值为 UID0512. */0513.function uc_agency_register($city,$companyname,$category,$userName,$companyEmail,$companyPass,$contactTel,$contactPerson,$companyAddress,$companyNo,$companyRegCount,$companyRegDate,$companyUnit,$companyInfo,$companyRemark){0514. 0515. return call_user_func(UC_API_FUNC,'agency','shopreg',array('city' => $city, 'companyname' => $companyname, 'category' => $category,'username' => $userName, 'companyEmail' => $companyEmail,'companyPass' => $companyPass, 'contactTel' => $contactTel, 'contactPerson' => $contactPerson, 'companyAddress' => $companyAddress,'companyNo' => $companyNo,'companyRegCount' => $companyRegCount, 'companyRegDate' => $companyRegDate,'companyUnit' => $companyUnit, 'companyInfo' => $companyInfo,'companyRemark' => $companyRemark));0516.}0517.