/[LeafOK_CVS]/lbbs/src/user_priv.c
ViewVC logotype

Annotation of /lbbs/src/user_priv.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.29 - (hide annotations)
Fri Feb 13 12:38:09 2026 UTC (4 weeks, 5 days ago) by sysadm
Branch: MAIN
CVS Tags: HEAD
Changes since 1.28: +6 -0 lines
Content type: text/x-csrc
Fix build error caused by inline function under Debug mode with CMake

1 sysadm 1.23 /* SPDX-License-Identifier: GPL-3.0-or-later */
2     /*
3     * user_priv
4     * - basic operations of user privilege
5     *
6 sysadm 1.28 * Copyright (C) 2004-2026 Leaflet <leaflet@leafok.com>
7 sysadm 1.23 */
8 sysadm 1.1
9 sysadm 1.25 #ifdef HAVE_CONFIG_H
10     #include "config.h"
11     #endif
12    
13 sysadm 1.1 #include "bbs.h"
14 sysadm 1.2 #include "common.h"
15 sysadm 1.10 #include "database.h"
16 sysadm 1.8 #include "log.h"
17 sysadm 1.21 #include "user_priv.h"
18 sysadm 1.8 #include <stdio.h>
19 sysadm 1.15 #include <stdlib.h>
20 sysadm 1.26 #include <mysql.h>
21 sysadm 1.1
22 sysadm 1.8 BBS_user_priv BBS_priv;
23    
24 sysadm 1.29 // External definitions for inline functions
25     extern inline int checklevel(BBS_user_priv *p_priv, int level);
26     extern inline int checklevel2(BBS_user_priv *p_priv, int level);
27     extern inline int checkpriv(BBS_user_priv *p_priv, int sid, int priv);
28     extern inline int is_favor(BBS_user_priv *p_priv, int sid);
29    
30 sysadm 1.18 inline static int search_priv(BBS_user_priv *p_priv, int sid, int *p_offset)
31 sysadm 1.2 {
32 sysadm 1.16 int left = 0;
33     int right = p_priv->s_count - 1;
34 sysadm 1.17 int mid = 0;
35 sysadm 1.16
36     while (left < right)
37     {
38     mid = (left + right) / 2;
39    
40 sysadm 1.22 if (sid < p_priv->s_priv_list[mid].sid)
41 sysadm 1.5 {
42 sysadm 1.22 right = mid - 1;
43 sysadm 1.5 }
44 sysadm 1.22 else if (sid > p_priv->s_priv_list[mid].sid)
45 sysadm 1.5 {
46 sysadm 1.16 left = mid + 1;
47 sysadm 1.5 }
48 sysadm 1.22 else // if (sid == p_priv->s_priv_list[mid].sid)
49     {
50     left = mid;
51     break;
52     }
53 sysadm 1.2 }
54 sysadm 1.16
55 sysadm 1.18 *p_offset = left;
56    
57 sysadm 1.22 return (sid == p_priv->s_priv_list[left].sid);
58 sysadm 1.18 }
59    
60     int setpriv(BBS_user_priv *p_priv, int sid, int priv, int is_favor)
61     {
62     int offset;
63     int i;
64    
65     if (sid == 0)
66     {
67     p_priv->g_priv = priv;
68     return 0;
69     }
70    
71 sysadm 1.23 if (search_priv(p_priv, sid, &offset)) // found
72 sysadm 1.2 {
73 sysadm 1.18 p_priv->s_priv_list[offset].s_priv = priv;
74     p_priv->s_priv_list[offset].is_favor = is_favor;
75 sysadm 1.16 return 0;
76     }
77    
78     // not found
79     if (p_priv->s_count >= BBS_max_section)
80     {
81     return -1;
82     }
83    
84     // move items at [left, p_priv->s_count - 1] to [left + 1, p_priv->s_count]
85 sysadm 1.18 for (i = p_priv->s_count - 1; i >= offset; i--)
86 sysadm 1.16 {
87 sysadm 1.18 p_priv->s_priv_list[i + 1] = p_priv->s_priv_list[i];
88 sysadm 1.2 }
89 sysadm 1.17 p_priv->s_count++;
90    
91 sysadm 1.16 // insert new item at offset left
92 sysadm 1.18 p_priv->s_priv_list[offset].sid = sid;
93     p_priv->s_priv_list[offset].s_priv = priv;
94     p_priv->s_priv_list[offset].is_favor = is_favor;
95 sysadm 1.5
96     return 0;
97     }
98    
99 sysadm 1.17 int getpriv(BBS_user_priv *p_priv, int sid, int *p_is_favor)
100 sysadm 1.5 {
101 sysadm 1.18 int offset;
102 sysadm 1.2
103 sysadm 1.23 if (search_priv(p_priv, sid, &offset)) // found
104 sysadm 1.17 {
105 sysadm 1.18 *p_is_favor = p_priv->s_priv_list[offset].is_favor;
106     return p_priv->s_priv_list[offset].s_priv;
107 sysadm 1.17 }
108    
109 sysadm 1.18 *p_is_favor = 0;
110 sysadm 1.5 return (sid >= 0 ? p_priv->g_priv : S_NONE);
111 sysadm 1.2 }
112    
113 sysadm 1.20 int load_priv(MYSQL *db, BBS_user_priv *p_priv, int uid)
114 sysadm 1.2 {
115 sysadm 1.5 MYSQL_RES *rs;
116     MYSQL_ROW row;
117 sysadm 1.10 char sql[SQL_BUFFER_LEN];
118 sysadm 1.17 int priv;
119     int is_favor;
120 sysadm 1.5
121     p_priv->uid = uid;
122     p_priv->level = (uid == 0 ? P_GUEST : P_USER);
123     p_priv->g_priv = S_DEFAULT;
124 sysadm 1.14 p_priv->s_count = 0;
125 sysadm 1.5
126     if (db == NULL)
127     return 1;
128    
129 sysadm 1.7 // Permission
130 sysadm 1.17 snprintf(sql, sizeof(sql),
131 sysadm 1.20 "SELECT p_post, p_msg FROM user_list WHERE UID = %d AND verified",
132 sysadm 1.16 uid);
133 sysadm 1.5 if (mysql_query(db, sql) != 0)
134     {
135 sysadm 1.27 log_error("Query user_list error: %s", mysql_error(db));
136 sysadm 1.5 return -1;
137     }
138     if ((rs = mysql_store_result(db)) == NULL)
139     {
140 sysadm 1.27 log_error("Get user_list data failed");
141 sysadm 1.5 return -1;
142     }
143 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
144 sysadm 1.5 {
145 sysadm 1.7 p_priv->g_priv |= (atoi(row[0]) ? S_POST : 0);
146     p_priv->g_priv |= (atoi(row[1]) ? S_MSG : 0);
147 sysadm 1.5 }
148     mysql_free_result(rs);
149    
150 sysadm 1.7 // Admin
151 sysadm 1.17 snprintf(sql, sizeof(sql),
152 sysadm 1.20 "SELECT major FROM admin_config WHERE UID = %d "
153 sysadm 1.17 "AND enable AND (NOW() BETWEEN begin_dt AND end_dt)",
154 sysadm 1.16 uid);
155 sysadm 1.5 if (mysql_query(db, sql) != 0)
156     {
157 sysadm 1.27 log_error("Query admin_config error: %s", mysql_error(db));
158 sysadm 1.5 return -1;
159     }
160     if ((rs = mysql_store_result(db)) == NULL)
161     {
162 sysadm 1.27 log_error("Get admin_config data failed");
163 sysadm 1.5 return -1;
164     }
165 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
166 sysadm 1.5 {
167 sysadm 1.9 p_priv->level |= (atoi(row[0]) ? P_ADMIN_M : P_ADMIN_S);
168     p_priv->g_priv |= (atoi(row[0]) ? S_ALL : S_ADMIN);
169 sysadm 1.5 }
170     mysql_free_result(rs);
171    
172     // Section Master
173 sysadm 1.17 snprintf(sql, sizeof(sql),
174     "SELECT section_master.SID, major FROM section_master "
175     "INNER JOIN section_config ON section_master.SID = section_config.SID "
176 sysadm 1.20 "WHERE UID = %d AND section_master.enable AND section_config.enable "
177 sysadm 1.17 "AND (NOW() BETWEEN begin_dt AND end_dt)",
178 sysadm 1.16 uid);
179 sysadm 1.5 if (mysql_query(db, sql) != 0)
180     {
181 sysadm 1.27 log_error("Query section_master error: %s", mysql_error(db));
182 sysadm 1.5 return -1;
183     }
184     if ((rs = mysql_store_result(db)) == NULL)
185     {
186 sysadm 1.27 log_error("Get section_master data failed");
187 sysadm 1.5 return -1;
188     }
189 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
190 sysadm 1.5 {
191     p_priv->level |= (atoi(row[1]) ? P_MAN_M : P_MAN_S);
192 sysadm 1.17 priv = (getpriv(p_priv, atoi(row[0]), &is_favor) | (atoi(row[1]) ? S_MAN_M : S_MAN_S));
193     setpriv(p_priv, atoi(row[0]), priv, is_favor);
194 sysadm 1.5 }
195     mysql_free_result(rs);
196    
197     // Section status
198 sysadm 1.17 snprintf(sql, sizeof(sql),
199     "SELECT SID, exp_get, read_user_level, write_user_level FROM section_config "
200     "INNER JOIN section_class ON section_config.CID = section_class.CID "
201     "WHERE section_config.enable AND section_class.enable "
202     "ORDER BY SID");
203 sysadm 1.5 if (mysql_query(db, sql) != 0)
204     {
205 sysadm 1.27 log_error("Query section_config error: %s", mysql_error(db));
206 sysadm 1.5 return -1;
207     }
208     if ((rs = mysql_store_result(db)) == NULL)
209     {
210 sysadm 1.27 log_error("Get section_config data failed");
211 sysadm 1.5 return -1;
212     }
213 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
214 sysadm 1.5 {
215 sysadm 1.17 int priv = getpriv(p_priv, atoi(row[0]), &is_favor);
216 sysadm 1.5 if (p_priv->level < atoi(row[2]))
217 sysadm 1.7 {
218     priv &= (~S_LIST);
219     }
220 sysadm 1.5 if (p_priv->level < atoi(row[3]))
221 sysadm 1.7 {
222     priv &= (~S_POST);
223     }
224 sysadm 1.5 if (!atoi(row[1]))
225 sysadm 1.7 {
226     priv &= (~S_GETEXP);
227     }
228 sysadm 1.17 setpriv(p_priv, atoi(row[0]), priv, is_favor);
229 sysadm 1.5 }
230     mysql_free_result(rs);
231 sysadm 1.2
232 sysadm 1.5 // Section ban
233 sysadm 1.17 snprintf(sql, sizeof(sql),
234 sysadm 1.20 "SELECT SID FROM ban_user_list WHERE UID = %d AND enable "
235 sysadm 1.17 "AND (NOW() BETWEEN ban_dt AND unban_dt)",
236 sysadm 1.16 uid);
237 sysadm 1.5 if (mysql_query(db, sql) != 0)
238     {
239 sysadm 1.27 log_error("Query ban_user_list error: %s", mysql_error(db));
240 sysadm 1.5 return -1;
241     }
242     if ((rs = mysql_store_result(db)) == NULL)
243     {
244 sysadm 1.27 log_error("Get ban_user_list data failed");
245 sysadm 1.5 return -1;
246     }
247 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
248 sysadm 1.5 {
249 sysadm 1.17 priv = getpriv(p_priv, atoi(row[0]), &is_favor) & (~S_POST);
250     setpriv(p_priv, atoi(row[0]), priv, is_favor);
251     }
252     mysql_free_result(rs);
253    
254     // User favor section
255     snprintf(sql, sizeof(sql),
256 sysadm 1.20 "SELECT SID FROM section_favorite WHERE UID = %d",
257 sysadm 1.17 uid);
258     if (mysql_query(db, sql) != 0)
259     {
260 sysadm 1.27 log_error("Query section_favorite error: %s", mysql_error(db));
261 sysadm 1.17 return -1;
262     }
263     if ((rs = mysql_store_result(db)) == NULL)
264     {
265 sysadm 1.27 log_error("Get section_favorite data failed");
266 sysadm 1.17 return -1;
267     }
268     while ((row = mysql_fetch_row(rs)))
269     {
270     priv = getpriv(p_priv, atoi(row[0]), &is_favor);
271     if (!is_favor)
272     {
273     setpriv(p_priv, atoi(row[0]), priv, 1);
274     priv = getpriv(p_priv, atoi(row[0]), &is_favor);
275     }
276 sysadm 1.5 }
277     mysql_free_result(rs);
278    
279     return 0;
280 sysadm 1.1 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1