/[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.15 - (hide annotations)
Mon May 26 02:56:59 2025 UTC (9 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.14: +6 -5 lines
Content type: text/x-csrc
Add mysql_error message

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.5 int i;
31     if (sid > 0)
32 sysadm 1.2 {
33 sysadm 1.5 for (i = 0; i < p_priv->s_count; i++)
34     {
35     if (p_priv->s_priv_list[i].sid == sid)
36     {
37     p_priv->s_priv_list[i].s_priv = priv;
38     return 0;
39     }
40     }
41     if (i < BBS_max_section)
42     {
43     p_priv->s_priv_list[i].s_priv = priv;
44     }
45     else
46     {
47     return -1;
48     }
49 sysadm 1.2 }
50 sysadm 1.5 else
51 sysadm 1.2 {
52 sysadm 1.5 p_priv->g_priv = priv;
53 sysadm 1.2 }
54 sysadm 1.5
55     return 0;
56     }
57    
58     int getpriv(BBS_user_priv *p_priv, int sid)
59     {
60     int i;
61     for (i = 0; i < p_priv->s_count; i++)
62 sysadm 1.2 {
63 sysadm 1.5 if (p_priv->s_priv_list[i].sid == sid)
64     return p_priv->s_priv_list[i].s_priv;
65 sysadm 1.2 }
66    
67 sysadm 1.5 return (sid >= 0 ? p_priv->g_priv : S_NONE);
68 sysadm 1.2 }
69    
70 sysadm 1.6 int load_priv(MYSQL *db, BBS_user_priv *p_priv, long int uid)
71 sysadm 1.2 {
72 sysadm 1.5 MYSQL_RES *rs;
73     MYSQL_ROW row;
74 sysadm 1.10 char sql[SQL_BUFFER_LEN];
75 sysadm 1.5
76     p_priv->uid = uid;
77     p_priv->level = (uid == 0 ? P_GUEST : P_USER);
78     p_priv->g_priv = S_DEFAULT;
79 sysadm 1.14 p_priv->s_count = 0;
80 sysadm 1.5
81     if (db == NULL)
82     return 1;
83    
84 sysadm 1.7 // Permission
85 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT p_post, p_msg FROM user_list WHERE UID = %ld AND verified",
86 sysadm 1.5 uid);
87     if (mysql_query(db, sql) != 0)
88     {
89 sysadm 1.15 log_error("Query user_list error: %s\n", mysql_error(db));
90 sysadm 1.5 return -1;
91     }
92     if ((rs = mysql_store_result(db)) == NULL)
93     {
94 sysadm 1.7 log_error("Get user_list data failed\n");
95 sysadm 1.5 return -1;
96     }
97 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
98 sysadm 1.5 {
99 sysadm 1.7 p_priv->g_priv |= (atoi(row[0]) ? S_POST : 0);
100     p_priv->g_priv |= (atoi(row[1]) ? S_MSG : 0);
101 sysadm 1.5 }
102     mysql_free_result(rs);
103    
104 sysadm 1.7 // Admin
105 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT major FROM admin_config WHERE UID = %ld "
106 sysadm 1.7 "AND enable AND (NOW() BETWEEN begin_dt AND end_dt)",
107 sysadm 1.5 uid);
108     if (mysql_query(db, sql) != 0)
109     {
110 sysadm 1.15 log_error("Query admin_config error: %s\n", mysql_error(db));
111 sysadm 1.5 return -1;
112     }
113     if ((rs = mysql_store_result(db)) == NULL)
114     {
115 sysadm 1.7 log_error("Get admin_config data failed\n");
116 sysadm 1.5 return -1;
117     }
118 sysadm 1.10 if ((row = mysql_fetch_row(rs)))
119 sysadm 1.5 {
120 sysadm 1.9 p_priv->level |= (atoi(row[0]) ? P_ADMIN_M : P_ADMIN_S);
121     p_priv->g_priv |= (atoi(row[0]) ? S_ALL : S_ADMIN);
122 sysadm 1.5 }
123     mysql_free_result(rs);
124    
125     // Section Master
126 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT section_master.SID, major FROM section_master "
127 sysadm 1.7 "INNER JOIN section_config ON section_master.SID = section_config.SID "
128     "WHERE UID = %ld AND section_master.enable AND section_config.enable "
129     "AND (NOW() BETWEEN begin_dt AND end_dt)",
130 sysadm 1.5 uid);
131     if (mysql_query(db, sql) != 0)
132     {
133 sysadm 1.15 log_error("Query section_master error: %s\n", mysql_error(db));
134 sysadm 1.5 return -1;
135     }
136     if ((rs = mysql_store_result(db)) == NULL)
137     {
138     log_error("Get section_master data failed\n");
139     return -1;
140     }
141 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
142 sysadm 1.5 {
143     p_priv->level |= (atoi(row[1]) ? P_MAN_M : P_MAN_S);
144     setpriv(p_priv, atoi(row[0]), getpriv(p_priv, atoi(row[0])) | (atoi(row[1]) ? S_MAN_M : S_MAN_S));
145     }
146     mysql_free_result(rs);
147    
148     // Section status
149 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT SID, exp_get, read_user_level, write_user_level FROM section_config "
150 sysadm 1.7 "INNER JOIN section_class ON section_config.CID = section_class.CID "
151     "WHERE section_config.enable AND section_class.enable "
152     "ORDER BY SID");
153 sysadm 1.5 if (mysql_query(db, sql) != 0)
154     {
155 sysadm 1.15 log_error("Query section_config error: %s\n", mysql_error(db));
156 sysadm 1.5 return -1;
157     }
158     if ((rs = mysql_store_result(db)) == NULL)
159     {
160     log_error("Get section_config data failed\n");
161     return -1;
162     }
163 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
164 sysadm 1.5 {
165 sysadm 1.7 int priv = getpriv(p_priv, atoi(row[0]));
166 sysadm 1.5 if (p_priv->level < atoi(row[2]))
167 sysadm 1.7 {
168     priv &= (~S_LIST);
169     }
170 sysadm 1.5 if (p_priv->level < atoi(row[3]))
171 sysadm 1.7 {
172     priv &= (~S_POST);
173     }
174 sysadm 1.5 if (!atoi(row[1]))
175 sysadm 1.7 {
176     priv &= (~S_GETEXP);
177     }
178     setpriv(p_priv, atoi(row[0]), priv);
179 sysadm 1.5 }
180     mysql_free_result(rs);
181 sysadm 1.2
182 sysadm 1.5 // Section ban
183 sysadm 1.11 snprintf(sql, sizeof(sql), "SELECT SID FROM ban_user_list WHERE UID = %ld AND enable "
184 sysadm 1.7 "AND (NOW() BETWEEN ban_dt AND unban_dt)",
185 sysadm 1.5 uid);
186     if (mysql_query(db, sql) != 0)
187     {
188 sysadm 1.15 log_error("Query ban_user_list error: %s\n", mysql_error(db));
189 sysadm 1.5 return -1;
190     }
191     if ((rs = mysql_store_result(db)) == NULL)
192     {
193     log_error("Get ban_user_list data failed\n");
194     return -1;
195     }
196 sysadm 1.10 while ((row = mysql_fetch_row(rs)))
197 sysadm 1.5 {
198     setpriv(p_priv, atoi(row[0]),
199     getpriv(p_priv, atoi(row[0])) & (~S_POST));
200     }
201     mysql_free_result(rs);
202    
203     return 0;
204 sysadm 1.1 }

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