/[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.17 - (hide annotations)
Fri May 30 02:56:02 2025 UTC (9 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.16: +68 -24 lines
Content type: text/x-csrc
Add s_favor

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

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