コード例 #1
0
ファイル: daemon.cpp プロジェクト: huzheng001/stardictd
static void daemon_getemail()
{
	if (userID.empty()) {
		daemon_printf( "%d unknow user id\n", CODE_DENIED );
		return;
	}
	if (init_database()) {
		daemon_printf( "%d Connect to MySQL failed!\n", CODE_DENIED );
		return;
	}
	std::string sql;
	sql = "SELECT email FROM user_basic WHERE id=";
	sql += userID;
	if (stardictdMain.conn.query(sql.c_str(), sql.length())) {
		daemon_printf( "%d query failed\n", CODE_DENIED );
		return;
	}
	MySQLResult *res = stardictdMain.conn.getResult();
	if (!res) {
		daemon_printf( "%d get result failed\n", CODE_DENIED );
		return;
	}
	DB_ROW row = res->fetchRow();
	if (!row) {
		res->destroy();
		daemon_printf( "%d fetch row failed\n", CODE_DENIED );
		return;
	}
	daemon_printf( "%d\n", CODE_OK );
	net_write_str(row[0]);
	res->destroy();
}
コード例 #2
0
ファイル: daemon.cpp プロジェクト: huzheng001/stardictd
static void daemon_change_password(std::string &user, std::string &base64_rsa_md5saltsum_old_password, std::string &base64_rsa_md5saltsum_new_password)
{
	std::vector<unsigned char> v;
	base64_decode(base64_rsa_md5saltsum_old_password, v);
	std::vector<unsigned char> v2;
	rsa_decrypt(v, v2, RSA_Public_Key_d, RSA_Public_Key_n);
	std::string old_passwd;
	vector_to_string(v2, old_passwd);

	base64_decode(base64_rsa_md5saltsum_new_password, v);
	rsa_decrypt(v, v2, RSA_Public_Key_d, RSA_Public_Key_n);
	std::string new_passwd;
	vector_to_string(v2, new_passwd);


	if (new_passwd.length()!=32) {
		daemon_printf( "%d wrong new password\n", CODE_DENIED );
		return;
	}
	if (init_database()) {
		daemon_printf( "%d Connect to MySQL failed!\n", CODE_DENIED );
		return;
	}
	std::string sql;
	if (auth_user != "root") {
		sql = "SELECT user_md5saltpassword FROM stardict_users WHERE username="******"%d Query failed!\n", CODE_DENIED );
			return;
		}
		MySQLResult *res = stardictdMain.conn.getResult();
		if (!res) {
			daemon_printf( "%d Get result failed!\n", CODE_DENIED );
			return;
		}
		DB_ROW row = res->fetchRow();
		if (!row) {
			res->destroy();
			daemon_printf( "%d user doesn't exist\n", CODE_DENIED );
			return;
		}
		if (old_passwd != row[0]) {
			res->destroy();
			daemon_printf( "%d old password is wrong\n", CODE_DENIED );
			return;
		}
		res->destroy();
	}
	sql = "UPDATE stardict_users SET user_md5saltpassword="******" WHERE username="******"%d Query failed!\n", CODE_DENIED );
		return;
	}
	daemon_printf( "%d\n", CODE_OK );
}
コード例 #3
0
ファイル: daemon.cpp プロジェクト: huzheng001/stardictd
static void daemon_getdictmask()
{
	if (userID.empty()) {
		daemon_printf( "%d unknow user id\n", CODE_USER_NOT_REGISTER );
		return;
	}
	if (init_database()) {
		daemon_printf( "%d Connect to MySQL failed!\n", CODE_DENIED );
		return;
	}
	std::string sql;
	sql = "SELECT dictmask FROM user_basic WHERE id=";
	sql += userID;
	if (stardictdMain.conn.query(sql.c_str(), sql.length())) {
		daemon_printf( "%d query failed\n", CODE_DENIED );
		return;
	}
	MySQLResult *res = stardictdMain.conn.getResult();
	if (!res) {
		daemon_printf( "%d get result failed\n", CODE_DENIED );
		return;
	}
	DB_ROW row = res->fetchRow();
	if (!row) {
		res->destroy();
		daemon_printf( "%d fetch row failed\n", CODE_DENIED );
		return;
	}
	daemon_printf( "%d\n", CODE_OK );
	const char *dictmask = row[0];

	char *str = g_strdup_printf("level-%d-user/max_dict_count", userLevel);
	const int max_dict_count = stardictdMain.conf->get_int(str);
	g_free(str);
	std::string dictmask_str = stardictdMain.oLibs.get_dicts_list(dictmask, max_dict_count, userLevel);
	net_write_str(dictmask_str.c_str());
	res->destroy();
}
コード例 #4
0
ファイル: daemon.cpp プロジェクト: huzheng001/stardictd
static void daemon_auth(std::string &user, std::string &key)
{
	if (user == "guest") {
		daemon_printf( "%d\n", CODE_OK );
		return;
	}
	char *buf;
	struct MD5Context ctx;
	unsigned char digest[16];
	char hex[33];
	if (user == "root") {
		std::string &root_password = stardictdMain.conf->get_str("root-user/password");
		if (root_password.empty()) {
			daemon_printf( "%d auth denied\n", CODE_DENIED );
			return;
		}
		MD5Init(&ctx);
		MD5Update(&ctx,  (const unsigned char*)"StarDict", 8); //StarDict-Protocol 0.4, add md5 salt.
		MD5Update(&ctx, (const unsigned char*)root_password.c_str(), root_password.length());
		MD5Final(digest, &ctx);
		for (int i = 0; i < 16; i++)
			snprintf( hex+2*i, 3, "%02x", digest[i] );
		hex[32] = '\0';
		buf = g_strdup_printf("%s%s", daemonStamp, hex);
	} else {
		if (init_database()) {
			daemon_printf( "%d Connect to MySQL failed!\n", CODE_DENIED );
			return;
		}
		std::string sql;
		sql = "SELECT user_id, user_md5saltpassword, level FROM stardict_users WHERE username="******"%d Query failed!\n", CODE_DENIED );
			return;
		}
		MySQLResult *res = stardictdMain.conn.getResult();
		if (!res) {
			daemon_printf( "%d Get result failed!\n", CODE_DENIED );
			return;
		}
		DB_ROW row = res->fetchRow();
		if (!row) {
			res->destroy();
			daemon_printf( "%d User doesn't exist!\n", CODE_DENIED );
			return;
		}
		userID = row[0];
		userLevel = atoi(row[2]);
		stardictdMain.SetUserLevel(userLevel);
		buf = g_strdup_printf("%s%s", daemonStamp, row[1]);
		res->destroy();
	}
	MD5Init(&ctx);
	MD5Update(&ctx, (const unsigned char*)buf, strlen(buf));
	MD5Final(digest, &ctx);
	for (int i = 0; i < 16; i++)
		snprintf( hex+2*i, 3, "%02x", digest[i] );
	hex[32] = '\0';
	g_free(buf);
	if (key != hex) {
		daemon_printf( "%d auth denied\n", CODE_DENIED );
		return;
	} else {
		daemon_printf( "%d authenticated\n", CODE_OK );
		auth_user=user;
		if (auth_user == "root") {
			stardictdMain.SetDictMask("", 0, 0);
		} else {
			std::string sql;
			sql = "SELECT dictmask, collatefunc, language FROM user_basic WHERE id=";
			sql+= userID;
			if (stardictdMain.conn.query(sql.c_str(), sql.length())) {
				daemon_printf( "%d Query failed!\n", CODE_DENIED );
				return;
			}
			MySQLResult *res = stardictdMain.conn.getResult();
			if (!res) {
				daemon_printf( "%d Get result failed!\n", CODE_DENIED );
				return;
			}
			DB_ROW row = res->fetchRow();
			if (row) {
				char *str = g_strdup_printf("level-%d-user/max_dict_count", userLevel);
				const int max_dict_count = stardictdMain.conf->get_int(str);
				g_free(str);
				stardictdMain.SetDictMask(row[0], max_dict_count, userLevel);
				bool enable_collate;
				if (userLevel == 0) {
					enable_collate = stardictdMain.conf->get_bool("level-0-user/enable_collate");
				} else {
					enable_collate = true;
				}
				if (enable_collate) {
					stardictdMain.SetServerCollateFunc(atoi(row[1]));
				} else {
					stardictdMain.SetServerCollateFunc(0);
				}
				stardictdMain.SetUserLang(row[2]);
			} else {
				stardictdMain.SetDictMask("", 0, 0);
				stardictdMain.SetServerCollateFunc(0);
			}
			res->destroy();
		}
	}
}
コード例 #5
0
ファイル: daemon.cpp プロジェクト: huzheng001/stardictd
static void daemon_userlevel(std::string &user, std::string &fromlevel, std::string &tolevel)
{
	if (auth_user != "root") {
		daemon_printf( "%d no permission\n", CODE_DENIED );
		return;
	}
	int from = atoi(fromlevel.c_str());
	if (fromlevel.empty() || from<0 || from>5) {
		daemon_printf( "%d wrong from-level\n", CODE_DENIED );
		return;
	}
	int to = atoi(tolevel.c_str());
	if (tolevel.empty() || to<0 || to>5 || to==from) {
		daemon_printf( "%d wrong to-level\n", CODE_DENIED );
		return;
	}
	if (init_database()) {
		daemon_printf( "%d Connect to MySQL failed!\n", CODE_DENIED );
		return;
	}
	std::string sql;
	sql = "SELECT level FROM stardict_users WHERE username="******"%d query user level failed\n", CODE_DENIED );
		return;
	}
	MySQLResult *res = stardictdMain.conn.getResult();
	if (!res) {
		daemon_printf( "%d Get result failed!\n", CODE_DENIED );
		return;
	}
	DB_ROW row = res->fetchRow();
	if (!row) {
		res->destroy();
		daemon_printf( "%d user doesn't exist.\n", CODE_DENIED );
		return;
	}
	int clevel = atoi(row[0]);
	res->destroy();
	if (clevel != from) {
		daemon_printf( "%d current level is %d.\n", CODE_DENIED, clevel );
		return;
	}
	sql = "UPDATE stardict_users SET level=";
	gchar *str = g_strdup_printf("%d", to);
	sql += str;
	g_free(str);
	sql += " WHERE username="******"%d query failed\n", CODE_DENIED );
		return;
	}
	std::string text;
	text = "Set user level: ";
	text += user;
	text += ' ';
	text += fromlevel;
	text += ' ';
	text += tolevel;
	stardictdMain.logger->log(LOG_ACCOUNT, text.c_str());
	daemon_printf( "%d\n", CODE_OK );
}