/[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.16 - (hide annotations)
Fri May 30 00:58:02 2025 UTC (9 months, 2 weeks ago) by sysadm
Branch: MAIN
Changes since 1.15: +66 -31 lines
Content type: text/x-csrc
Refine getpriv / setpriv with binary search

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.5 int setpriv(BBS_user_priv *p_priv, int sid, int priv)
29 sysadm 1.2 {
30 sysadm 1.16 int left = 0;
31     int right = p_priv->s_count - 1;
32     int mid;
33    
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     if (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     return 0;
58     }
59    
60     // not found
61     if (p_priv->s_count >= BBS_max_section)
62     {
63     return -1;
64     }
65    
66     // move items at [left, p_priv->s_count - 1] to [left + 1, p_priv->s_count]
67     for (right = p_priv->s_count - 1; right >= left; right--)
68     {
69     p_priv->s_priv_list[right + 1] = p_priv->s_priv_list[right];
70 sysadm 1.2 }
71 sysadm 1.16 // insert new item at offset left
72     p_priv->s_priv_list[left].s_priv = priv;
73 sysadm 1.5
74     return 0;
75     }
76    
77     int getpriv(BBS_user_priv *p_priv, int sid)
78     {
79 sysadm 1.16 int left = 0;
80     int right = p_priv->s_count - 1;
81     int mid;
82    
83     while (left < right)
84     {
85     mid = (left + right) / 2;
86    
87     if (sid <= p_priv->s_priv_list[mid].sid)
88     {
89     right = mid;
90     }
91     else
92     {
93     left = mid + 1;
94     }
95     }
96    
97     if (sid == p_priv->s_priv_list[left].sid) // found
98 sysadm 1.2 {
99 sysadm 1.16 return p_priv->s_priv_list[left].s_priv;
100 sysadm 1.2 }
101    
102 sysadm 1.5 return (sid >= 0 ? p_priv->g_priv : S_NONE);
103 sysadm 1.2 }
104    
105 sysadm 1.6 int load_priv(MYSQL *db, BBS_user_priv *p_priv, long int uid)
106 sysadm 1.2 {
107 sysadm 1.5 MYSQL_RES *rs;
108     MYSQL_ROW row;
109 sysadm 1.10 char sql[SQL_BUFFER_LEN];
110 sysadm 1.5
111     p_priv->uid = uid;
112     p_priv->level = (uid == 0 ? P_GUEST : P_USER);
113     p_priv->g_priv = S_DEFAULT;
114 sysadm 1.14 p_priv->s_count = 0;
115 sysadm 1.5
116     if (db == NULL)
117     return 1;
118    
119 sysadm 1.7 // Permission
120 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT p_post, p_msg FROM user_list WHERE UID = %ld AND verified",
121 sysadm 1.16 uid);
122 sysadm 1.5 if (mysql_query(db, sql) != 0)
123     {
124 sysadm 1.15 log_error("Query user_list error: %s\n", mysql_error(db));
125 sysadm 1.5 return -1;
126     }
127     if ((rs = mysql_store_result(db)) == NULL)
128     {
129 sysadm 1.7 log_error("Get user_list data failed\n");
130 sysadm 1.5 return -1;
131     }
132 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
133 sysadm 1.5 {
134 sysadm 1.7 p_priv->g_priv |= (atoi(row[0]) ? S_POST : 0);
135     p_priv->g_priv |= (atoi(row[1]) ? S_MSG : 0);
136 sysadm 1.5 }
137     mysql_free_result(rs);
138    
139 sysadm 1.7 // Admin
140 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT major FROM admin_config WHERE UID = %ld "
141 sysadm 1.16 "AND enable AND (NOW() BETWEEN begin_dt AND end_dt)",
142     uid);
143 sysadm 1.5 if (mysql_query(db, sql) != 0)
144     {
145 sysadm 1.15 log_error("Query admin_config error: %s\n", mysql_error(db));
146 sysadm 1.5 return -1;
147     }
148     if ((rs = mysql_store_result(db)) == NULL)
149     {
150 sysadm 1.7 log_error("Get admin_config data failed\n");
151 sysadm 1.5 return -1;
152     }
153 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
154 sysadm 1.5 {
155 sysadm 1.9 p_priv->level |= (atoi(row[0]) ? P_ADMIN_M : P_ADMIN_S);
156     p_priv->g_priv |= (atoi(row[0]) ? S_ALL : S_ADMIN);
157 sysadm 1.5 }
158     mysql_free_result(rs);
159    
160     // Section Master
161 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT section_master.SID, major FROM section_master "
162 sysadm 1.16 "INNER JOIN section_config ON section_master.SID = section_config.SID "
163     "WHERE UID = %ld AND section_master.enable AND section_config.enable "
164     "AND (NOW() BETWEEN begin_dt AND end_dt)",
165     uid);
166 sysadm 1.5 if (mysql_query(db, sql) != 0)
167     {
168 sysadm 1.15 log_error("Query section_master error: %s\n", mysql_error(db));
169 sysadm 1.5 return -1;
170     }
171     if ((rs = mysql_store_result(db)) == NULL)
172     {
173     log_error("Get section_master data failed\n");
174     return -1;
175     }
176 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
177 sysadm 1.5 {
178     p_priv->level |= (atoi(row[1]) ? P_MAN_M : P_MAN_S);
179     setpriv(p_priv, atoi(row[0]), getpriv(p_priv, atoi(row[0])) | (atoi(row[1]) ? S_MAN_M : S_MAN_S));
180     }
181     mysql_free_result(rs);
182    
183     // Section status
184 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT SID, exp_get, read_user_level, write_user_level FROM section_config "
185 sysadm 1.16 "INNER JOIN section_class ON section_config.CID = section_class.CID "
186     "WHERE section_config.enable AND section_class.enable "
187     "ORDER BY SID");
188 sysadm 1.5 if (mysql_query(db, sql) != 0)
189     {
190 sysadm 1.15 log_error("Query section_config error: %s\n", mysql_error(db));
191 sysadm 1.5 return -1;
192     }
193     if ((rs = mysql_store_result(db)) == NULL)
194     {
195     log_error("Get section_config data failed\n");
196     return -1;
197     }
198 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
199 sysadm 1.5 {
200 sysadm 1.7 int priv = getpriv(p_priv, atoi(row[0]));
201 sysadm 1.5 if (p_priv->level < atoi(row[2]))
202 sysadm 1.7 {
203     priv &= (~S_LIST);
204     }
205 sysadm 1.5 if (p_priv->level < atoi(row[3]))
206 sysadm 1.7 {
207     priv &= (~S_POST);
208     }
209 sysadm 1.5 if (!atoi(row[1]))
210 sysadm 1.7 {
211     priv &= (~S_GETEXP);
212     }
213     setpriv(p_priv, atoi(row[0]), priv);
214 sysadm 1.5 }
215     mysql_free_result(rs);
216 sysadm 1.2
217 sysadm 1.5 // Section ban
218 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT SID FROM ban_user_list WHERE UID = %ld AND enable "
219 sysadm 1.16 "AND (NOW() BETWEEN ban_dt AND unban_dt)",
220     uid);
221 sysadm 1.5 if (mysql_query(db, sql) != 0)
222     {
223 sysadm 1.15 log_error("Query ban_user_list error: %s\n", mysql_error(db));
224 sysadm 1.5 return -1;
225     }
226     if ((rs = mysql_store_result(db)) == NULL)
227     {
228     log_error("Get ban_user_list data failed\n");
229     return -1;
230     }
231 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
232 sysadm 1.5 {
233     setpriv(p_priv, atoi(row[0]),
234     getpriv(p_priv, atoi(row[0])) & (~S_POST));
235     }
236     mysql_free_result(rs);
237    
238     return 0;
239 sysadm 1.1 }

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