ANF到DNT完美转移
下面列步骤:
一、安装dnt
二、官方转换工具。转用户,板块,主题,帖子。(板块转移有问题,在后台重新调整下板块顺序和所属即可。)
三、到数据库设计dnt_users表,把password改成varchar 64.
四、用下面语句重新转移密码。
五、设计dnt_users表,增加salt列,设置成varchar 20即可。
六、用下列语句转移salt
七、用vs2005打开dnt项目。打开Discuz_Forum/UserFactory.cs
搜索CheckDvBbsPasswordAndSecques和CheckDvBbsPassword两个函数,选择这2个函数删除,替换成如下函数。
/// <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里做如下配置
这才叫完美嘛!
一、安装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
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
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
RewriteRule ^/([0-9]+)/ShowPost/.aspx$ /showtopic-$1.aspx
RewriteRule ^/([0-9]+)/ShowForum/.aspx$ /showforum-$1.aspx
这才叫完美嘛!