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

Contents of /lbbs/src/user_priv.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.18 - (show annotations)
Fri May 30 04:28:27 2025 UTC (9 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.17: +30 -40 lines
Content type: text/x-csrc
Refine

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

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