Perl Forum User -> MT User, 密码问题原来很简单

This is a SiteLog of Easun's WebBlog。

装了自带 Community Pack 1.6 的 Movable Type 4.21 Pro,也用 Community Pack 功能建立了测试的 MT Forum,初衷是想用这个MT Forum 取代 基于 LB5000 ES Lite 建立的本站半废弃状态的 Perl Forum
简单的作了测试,帖子的转移很简单,用Perl写个小玩意,导出成 MT 系统能认识的文本就足够了。而User的转移貌似出现的密码问题上了。
当初匆匆检测功能,没有细思量,总之, Perl Forum 采用的 MD5 加密密码,而 MT User 的密码则是采用随机数和原始密码用 Unix crypt function 来加密的。貌似转化起来很是有点问题。
好久没有看原代码了,今天晚上有点时间,看了看 MT 关于 Auth 的代码。发现其实很简单,在用户输入的时候多一重判断就是

思路有了,代码也就很Easy了:)
临时用 hint 字段存储 md5 后的 Perl Forum 密码,设特定的MT User 密码字段为 (esb),然后检测md5($pass),判断,转化就是。
简单的修改如下:
找到 ${MTDIR}lib/MT/Auth/MT.pm,定位函数 sub is_valid_password


return $crypted ? $real_pass eq $pass :
crypt($pass, $real_pass) eq $real_pass;

上方加设以下代码:

    
if ($real_pass eq '(esb)') {
        my $esb_hint = $author->column('hint');
        ($esb_hint,my $real_hint) = split(/\#esb\#/,$esb_hint);
        require Digest::MD5;
        my $md5_pass = Digest::MD5::md5_hex($pass);
        if ($md5_pass eq $esb_hint){
            $author->set_password($pass);
            $author->hint($real_hint);
            # $author->column('hint', $real_hint);
           $author->save
               or die $author->errstr;
            return 1;
        }
        return 0;
    }

完成后测试一切OK,现在缺少的就是等一个比较用空的时候,彻底迁移 Perl Forum :D