ANF到DNT完美转移

来源:互联网 发布:流星加速器下载软件 编辑:程序博客网 时间:2024/04/28 22:21

ANF到DNT完美转移

下面列步骤:
一、安装dnt
二、官方转换工具。转用户,板块,主题,帖子。(板块转移有问题,在后台重新调整下板块顺序和所属即可。)
三、到数据库设计dnt_users表,把password改成varchar 64.
四、用下面语句重新转移密码。

[复制到剪贴板]
CODE:
UPDATE dnt_users
    SET dnt_users.password=forums_Users.Password
    FROM dnt_users, forums_users
    WHERE  dnt_users.uid = forums_users.Userid


五、设计dnt_users表,增加salt列,设置成varchar 20即可。
六、用下列语句转移salt

[复制到剪贴板]
CODE:
UPDATE dnt_users
    SET dnt_users.salt=forums_users.Salt
    FROM dnt_users, forums_users
    WHERE  dnt_users.uid = forums_users.userid


七、用vs2005打开dnt项目。打开Discuz_Forum/UserFactory.cs
搜索CheckDvBbsPasswordAndSecques和CheckDvBbsPassword两个函数,选择这2个函数删除,替换成如下函数。

[复制到剪贴板]
CODE:


/// <summary>
        /// 检测DVBBS兼容模式的密码 //by bagheera 这里通过改动dvbbs的代码实现anf兼容,后台设置成兼容dvbbs即可。
  /// </summary>
  /// <param name="username">用户名</param>
  /// <param name="password">密码</param>
  /// <param name="questionid">问题id</param>
  /// <param name="answer">答案</param>
  /// <returns>如果正确则返回用户id, 否则返回-1</returns>
  public static int CheckDvBbsPasswordAndSecques(string username, string password, int questionid, string answer)
  {
  SqlParameter[] prams = {
            Database.MakeInParam("@username",SqlDbType.Char,20,username),
            Database.MakeInParam("@password",SqlDbType.Char,64,password)
          };
  SqlDataReader reader = Database.ExecuteReader(CommandType.Text, "SELECT TOP 1 [uid], [password], [salt],[secques] FROM ["+BaseConfigFactory.GetTablePrefix+"users] WHERE [username]=@username", prams);
  int uid = -1;
  if(reader.Read())
  {
    if (reader["secques"].ToString().Trim() != ForumUtils.GetUserSecques(questionid, answer))
    {
    return -1;
    }
    string pw = reader["password"].ToString().Trim();
                if (pw.Length < 33)  //判断长度来判断是否恢复成32位。
                {
                    if (Utils.MD5(password) == pw)
                    {
                        uid = Utils.StrToInt(reader["uid"].ToString(), -1);
                    }
                }
                else
                {
                    string salt = reader["salt"].ToString().Trim();
                    if (myenc(password, salt) == pw)  //使用下面自己写的anf加密函数,实现判断。
                    {
                        uid = Utils.StrToInt(reader["uid"].ToString(), -1);
                        UpdateUserPassword(uid, password);      //更新密码为32位md5
                    }
    }
  }
  reader.Close();
  return uid;
  }
  /// <summary>
        /// 检测DVBBS兼容模式的密码  //by bagheera 这里通过改动dvbbs的代码实现,后台设置成兼容dvbbs即可。
  /// </summary>
  /// <param name="username">用户名</param>
  /// <param name="password">密码</param>
  /// <returns>如果正确则返回用户id, 否则返回-1</returns>
  public static int CheckDvBbsPassword(string username, string password)
  {

  SqlParameter[] prams = {
            Database.MakeInParam("@username",SqlDbType.Char,20,username),
            Database.MakeInParam("@password",SqlDbType.Char,64,password)
          };
  SqlDataReader reader = Database.ExecuteReader(CommandType.Text, "SELECT TOP 1 [uid], [password],[salt] FROM ["+BaseConfigFactory.GetTablePrefix+"users] WHERE [username]=@username", prams);
  int uid = -1;
  if(reader.Read())
  {
    string pw = reader["password"].ToString().Trim();
    if (pw.Length < 33)  //判断长度来判断是否恢复成32位。
    {
    if (Utils.MD5(password) == pw)
    {
      uid = Utils.StrToInt(reader["uid"].ToString(), -1);
    }
    }
    else
    {
                    string salt = reader["salt"].ToString().Trim();
   
                    if ( myenc(password, salt) == pw)  //使用下面自己写的anf加密函数,实现判断。
    {
      uid = Utils.StrToInt(reader["uid"].ToString(), -1);
      UpdateUserPassword(uid, password);      //更新密码为32位md5
    }
    }
  }
  reader.Close();
  return uid;
  }
  ///增加 by bagheera
        ///anf的加密方法
        public static String myenc(string pass, string salt)
        {
            Byte[] clearBytes;
            Byte[] hashedBytes;
            System.Text.Encoding encoding = System.Text.Encoding.Unicode; //这里修改编码。
            clearBytes = encoding.GetBytes(salt.ToLower().Trim() + pass.Trim());
            hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes); //可以修改MD5为SHA1
            return BitConverter.ToString(hashedBytes);
        }


八、重新编译生成。替换bin/Discuz.Forum.dll(注意:如果你下载的官方安装包,而不是源码,那么你需要下源码,并拿源码包里的admin目录覆盖安装包的admin,否则登录后台会报错。)

九、登录后台,设置密码模式为兼容DVBBS。即可用原论坛密码进行登录。(转移过程中会把管理员密码替换成anf的密码,无法登录请尝试原论坛密码。)

十、已经完美运行,哦也,编译好的Discuz.Forum.dll稍后提供下载。


谢谢大家支持,呵呵。


加点东西,使之更完美,呵呵~

十一、为了照顾已经被搜索引擎收录的帖子。在IISUrlRewriter.ini里做如下配置

[复制到剪贴板]
CODE:
    #by bagheera for ANF
    RewriteRule ^/([0-9]+)/ShowPost/.aspx$  /showtopic-$1.aspx
    RewriteRule ^/([0-9]+)/ShowForum/.aspx$  /showforum-$1.aspx


这才叫完美嘛!
 
原创粉丝点击