--- lbbs/src/user_priv.c 2025/05/30 02:56:02 1.17 +++ lbbs/src/user_priv.c 2025/11/16 11:06:06 1.26 @@ -1,60 +1,71 @@ -/*************************************************************************** - user_priv.c - description - ------------------- - Copyright : (C) 2004-2025 by Leaflet - Email : leaflet@leafok.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * user_priv + * - basic operations of user privilege + * + * Copyright (C) 2004-2025 Leaflet + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -#include "user_priv.h" #include "bbs.h" #include "common.h" #include "database.h" #include "log.h" +#include "user_priv.h" #include -#include #include +#include BBS_user_priv BBS_priv; -int setpriv(BBS_user_priv *p_priv, int sid, int priv, int is_favor) +inline static int search_priv(BBS_user_priv *p_priv, int sid, int *p_offset) { int left = 0; int right = p_priv->s_count - 1; int mid = 0; - if (sid == 0) - { - p_priv->g_priv = priv; - return 0; - } - while (left < right) { mid = (left + right) / 2; - if (sid <= p_priv->s_priv_list[mid].sid) + if (sid < p_priv->s_priv_list[mid].sid) { - right = mid; + right = mid - 1; } - else + else if (sid > p_priv->s_priv_list[mid].sid) { left = mid + 1; } + else // if (sid == p_priv->s_priv_list[mid].sid) + { + left = mid; + break; + } + } + + *p_offset = left; + + return (sid == p_priv->s_priv_list[left].sid); +} + +int setpriv(BBS_user_priv *p_priv, int sid, int priv, int is_favor) +{ + int offset; + int i; + + if (sid == 0) + { + p_priv->g_priv = priv; + return 0; } - if (left == right && sid == p_priv->s_priv_list[left].sid) // found + if (search_priv(p_priv, sid, &offset)) // found { - p_priv->s_priv_list[left].s_priv = priv; - p_priv->s_priv_list[left].is_favor = is_favor; + p_priv->s_priv_list[offset].s_priv = priv; + p_priv->s_priv_list[offset].is_favor = is_favor; return 0; } @@ -65,55 +76,35 @@ int setpriv(BBS_user_priv *p_priv, int s } // move items at [left, p_priv->s_count - 1] to [left + 1, p_priv->s_count] - for (right = p_priv->s_count - 1; right >= left; right--) + for (i = p_priv->s_count - 1; i >= offset; i--) { - p_priv->s_priv_list[right + 1] = p_priv->s_priv_list[right]; + p_priv->s_priv_list[i + 1] = p_priv->s_priv_list[i]; } p_priv->s_count++; // insert new item at offset left - p_priv->s_priv_list[left].sid = sid; - p_priv->s_priv_list[left].s_priv = priv; - p_priv->s_priv_list[left].is_favor = is_favor; + p_priv->s_priv_list[offset].sid = sid; + p_priv->s_priv_list[offset].s_priv = priv; + p_priv->s_priv_list[offset].is_favor = is_favor; return 0; } int getpriv(BBS_user_priv *p_priv, int sid, int *p_is_favor) { - int left = 0; - int right = p_priv->s_count - 1; - int mid = 0; - - while (left < right) - { - mid = (left + right) / 2; - - if (sid <= p_priv->s_priv_list[mid].sid) - { - right = mid; - } - else - { - left = mid + 1; - } - } - - if (left == right && sid == p_priv->s_priv_list[left].sid) // found - { - *p_is_favor = p_priv->s_priv_list[left].is_favor; - return p_priv->s_priv_list[left].s_priv; - } + int offset; - if (sid != 0) + if (search_priv(p_priv, sid, &offset)) // found { - *p_is_favor = 0; + *p_is_favor = p_priv->s_priv_list[offset].is_favor; + return p_priv->s_priv_list[offset].s_priv; } + *p_is_favor = 0; return (sid >= 0 ? p_priv->g_priv : S_NONE); } -int load_priv(MYSQL *db, BBS_user_priv *p_priv, long int uid) +int load_priv(MYSQL *db, BBS_user_priv *p_priv, int uid) { MYSQL_RES *rs; MYSQL_ROW row; @@ -131,7 +122,7 @@ int load_priv(MYSQL *db, BBS_user_priv * // Permission snprintf(sql, sizeof(sql), - "SELECT p_post, p_msg FROM user_list WHERE UID = %ld AND verified", + "SELECT p_post, p_msg FROM user_list WHERE UID = %d AND verified", uid); if (mysql_query(db, sql) != 0) { @@ -152,7 +143,7 @@ int load_priv(MYSQL *db, BBS_user_priv * // Admin snprintf(sql, sizeof(sql), - "SELECT major FROM admin_config WHERE UID = %ld " + "SELECT major FROM admin_config WHERE UID = %d " "AND enable AND (NOW() BETWEEN begin_dt AND end_dt)", uid); if (mysql_query(db, sql) != 0) @@ -176,7 +167,7 @@ int load_priv(MYSQL *db, BBS_user_priv * snprintf(sql, sizeof(sql), "SELECT section_master.SID, major FROM section_master " "INNER JOIN section_config ON section_master.SID = section_config.SID " - "WHERE UID = %ld AND section_master.enable AND section_config.enable " + "WHERE UID = %d AND section_master.enable AND section_config.enable " "AND (NOW() BETWEEN begin_dt AND end_dt)", uid); if (mysql_query(db, sql) != 0) @@ -234,7 +225,7 @@ int load_priv(MYSQL *db, BBS_user_priv * // Section ban snprintf(sql, sizeof(sql), - "SELECT SID FROM ban_user_list WHERE UID = %ld AND enable " + "SELECT SID FROM ban_user_list WHERE UID = %d AND enable " "AND (NOW() BETWEEN ban_dt AND unban_dt)", uid); if (mysql_query(db, sql) != 0) @@ -256,7 +247,7 @@ int load_priv(MYSQL *db, BBS_user_priv * // User favor section snprintf(sql, sizeof(sql), - "SELECT SID FROM section_favorite WHERE UID = %ld", + "SELECT SID FROM section_favorite WHERE UID = %d", uid); if (mysql_query(db, sql) != 0) {