/[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.22 - (hide annotations)
Fri Oct 24 02:07:01 2025 UTC (4 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.21: +9 -4 lines
Content type: text/x-csrc
Refine search algorithm

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

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