杭州神话信息技术有限公司

标题: 记事狗2.0(2010-09-02)版整合ucenter的bug修正 [打印本页]

作者: lonestone    时间: 2010-10-21 22:52:55     标题: 记事狗2.0(2010-09-02)版整合ucenter的bug修正

本帖最后由 lonestone 于 2010-10-21 23:21 编辑

折腾了几个晚上,死活就是不能同步登录退出,跟踪来跟踪去,最后发现问题出在api/uc.php接口文件中。

这里,我们不用替换最新版uc_client, 就用2.0自带的,这个和uc_server的版本没啥关系,我们需要替换这个接口文件中的几个函数即可。

具体bug是里面的函数错了。有什么区别(我删除了JishiGouAuthcode函数,这个函数编码方法是不对的,修改了下自带的_authcode函数,问题就出在这里),大家可以自己对比一下我提供的uc.php代码:

先替换:

  1. function synlogin($get, $post) {
  2.   $uid = (int) $get['uid'];
  3.   $username = $get['username'];
  4.   if(!API_SYNLOGIN) {
  5.    return API_RETURN_FORBIDDEN;
  6.   }
  7.     header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

  8.   $query = $this->db->query("SELECT uid, password, secques FROM {$this->tablepre}members WHERE ucuid='$uid'");
  9.   $UserFields = $this->db->fetch_array($query);
  10.   if($UserFields) {

  11.    $auth = _authcode("{$UserFields['password']}\t{$UserFields['secques']}\t{$UserFields['uid']}");
  12.    _setcookie('sid', '', -86400 * 365);
  13.    _setcookie('auth',$auth,(365*86400));
  14.    _setcookie('cookietime','2592000',(365*86400));
  15.   }
  16.   else {
  17.    
  18.   }
  19. }
复制代码


然后替换:
  1. function _authcode($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
  2.     global $config;
  3. $ckey_length = 4;
  4.     if(!$key) {
  5.   $key = md5($config['auth_key'].$_SERVER['HTTP_USER_AGENT']);
  6. }
  7. $key = md5($key ? $key : UC_KEY);
  8. $keya = md5(substr($key, 0, 16));
  9. $keyb = md5(substr($key, 16, 16));
  10. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
  11. $cryptkey = $keya.md5($keya.$keyc);
  12. $key_length = strlen($cryptkey);
  13. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  14. $string_length = strlen($string);
  15. $result = '';
  16. $box = range(0, 255);
  17. $rndkey = array();
  18. for($i = 0; $i <= 255; $i++) {
  19.   $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  20. }
  21. for($j = $i = 0; $i < 256; $i++) {
  22.   $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  23.   $tmp = $box[$i];
  24.   $box[$i] = $box[$j];
  25.   $box[$j] = $tmp;
  26. }
  27. for($a = $j = $i = 0; $i < $string_length; $i++) {
  28.   $a = ($a + 1) % 256;
  29.   $j = ($j + $box[$a]) % 256;
  30.   $tmp = $box[$a];
  31.   $box[$a] = $box[$j];
  32.   $box[$j] = $tmp;
  33.   $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  34. }
  35. if($operation == 'DECODE') {
  36.   if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  37.    return substr($result, 26);
  38.   } else {
  39.     return '';
  40.    }
  41. } else {
  42.   return $keyc.str_replace('=', '', base64_encode($result));
  43. }
  44. }
复制代码


如此替换后,从dx登录和退出,记事狗也会同样动作,但记事狗中退出的话,却还是无效,原因在这里

修改 modules/login.mod.php 中的 LogOut() 函数,大约 261行。
其中的

  1. $this->Messager(null,'?');
复制代码


  1. $this->Messager("{$msg}退出成功",'?',5);
复制代码


难道是写到这里,程序员迷糊了,不输出html怎么同步?

应该就可以顺利的同步登录退出了!这个问题官方难道是故意的?呵呵,这么多人报告就没有回应。
作者: hanyu5782    时间: 2010-10-22 03:55:40

楼主最上面两个替换 替换  是用哪个替换哪个啊
作者: 咸阳社区    时间: 2010-10-22 09:17:39

呵呵 学习了
作者: eric_jsg    时间: 2010-10-22 09:41:43

替换的是根目录下API里面的UC.PHP
139行 function synlogin
358行 function jishigouauthcode
作者: deman    时间: 2010-10-22 12:14:07

官方不给力啊。
楼主很给力
作者: sundoing    时间: 2010-10-22 17:46:59

回复 1# lonestone

还是不行,通信失败
作者: lonestone    时间: 2010-10-25 12:55:14

替换的是根目录下API里面的UC.PHP
139行 function synlogin
358行 function jishigouauthcode
eric_jsg 发表于 2010-10-22 09:41


我没说清楚,呵呵,jishigouauthcode 这个函数删除掉的,不是替换哦。这个函数用不上了。
作者: lonestone    时间: 2010-10-25 12:56:39

回复  lonestone

还是不行,通信失败
sundoing 发表于 2010-10-22 17:46


前提是通信成功后,再出现不能同步登录退出的问题,这个修正是针对这个问题的。
作者: 放牛郎    时间: 2010-10-25 16:44:34

感谢楼主提供修复方法。
官方提供的“记事狗2.0与DiscuzX1.5通过ucenter整合最终解决方案”点此查看http://cenwor.com/thread-3656-1-1.html
作者: gavin    时间: 2010-11-9 10:51:31

楼主太给力了。谢谢哈
作者: zuoshi    时间: 2010-11-16 08:25:22

真强,估计官方是故意的,原因是瞌睡了,还不给奖金,哈哈哈
作者: HaveOneDream    时间: 2011-1-8 12:34:00

微博退出,DX没有退出 是何原因




欢迎光临 杭州神话信息技术有限公司 (http://cenwor.com/) Powered by Discuz! X2