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

Diff of /lbbs/src/user_priv.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.1 by sysadm, Fri Oct 22 15:21:28 2004 UTC Revision 1.4 by sysadm, Sun Mar 20 17:37:14 2005 UTC
# Line 16  Line 16 
16   ***************************************************************************/   ***************************************************************************/
17    
18  #include "bbs.h"  #include "bbs.h"
19    #include "common.h"
20  #include <mysql.h>  #include <mysql.h>
21    
22  int  int
23  load_priv (MYSQL * db, BBS_user_priv * p_priv, int uid,  checklevel (BBS_user_priv * p_priv, int level)
   int auth_uid, int priv_excluse)  
24  {  {
25      return (((p_priv->level & level)) ^ level ? 0 : 1);
26    }
27    
28    int
29    setpriv (BBS_user_priv * p_priv, int sid, int priv)
30    {
31      int i;
32      if (sid > 0)
33        {
34          for (i = 0; i < p_priv->s_count; i++)
35            {
36              if (p_priv->s_priv_list[i].sid == sid)
37                {
38                  p_priv->s_priv_list[i].s_priv = priv;
39                  return 0;
40                }
41            }
42          if (i < BBS_max_section)
43            {
44              p_priv->s_priv_list[i].s_priv = priv;
45            }
46          else
47            {
48              return -1;
49            }
50        }
51      else
52        {
53          p_priv->g_priv = priv;
54        }
55    
56      return 0;
57    }
58    
59    int
60    getpriv (BBS_user_priv * p_priv, int sid)
61    {
62      int i;
63      for (i = 0; i < p_priv->s_count; i++)
64        {
65          if (p_priv->s_priv_list[i].sid == sid)
66            return p_priv->s_priv_list[i].s_priv;
67        }
68    
69      return (sid >= 0 ? p_priv->g_priv : S_NONE);
70    }
71    
72    int
73    checkpriv (BBS_user_priv * p_priv, int sid, int priv)
74    {
75      return (((getpriv (p_priv, sid) & priv)) ^ priv ? 0 : 1);
76    }
77    
78    
79    int
80    load_priv (MYSQL * db, BBS_user_priv * p_priv, long int uid,
81               long int auth_uid, int priv_excluse)
82    {
83      MYSQL_RES *rs;
84      MYSQL_ROW row;
85      char sql[1024];
86      int i;
87    
88      p_priv->uid = uid;
89      p_priv->auid = auth_uid;
90      p_priv->level = (uid == 0 ? P_GUEST : P_USER);
91      p_priv->level |= (auth_uid == 0 ? P_GUEST : P_AUTH_USER);
92      p_priv->g_priv = S_DEFAULT;
93    
94      if (db == NULL)
95        return 1;
96    
97      //Admin
98      sprintf (sql, "select aid,major from admin_config where UID=%ld"
99               " and enable and (now() between begin_dt and end_dt)", uid);
100      if (mysql_query (db, sql) != 0)
101        {
102          log_error ("Query admin_config failed\n");
103          return -1;
104        }
105      if ((rs = mysql_store_result (db)) == NULL)
106        {
107          log_error ("Get admin_config data failed\n");
108          return -1;
109        }
110      if (row = mysql_fetch_row (rs))
111        {
112          p_priv->level |= (atoi (row[1]) ? P_ADMIN_M : P_ADMIN_S);
113          p_priv->g_priv |= (atoi (row[1]) ? S_ALL : S_ADMIN);
114        }
115      mysql_free_result (rs);
116    
117      //Permission
118      sprintf (sql, "select p_post,p_msg,p_mail "
119               "from user_list where UID=%ld", uid);
120      if (mysql_query (db, sql) != 0)
121        {
122          log_error ("Query user_list failed\n");
123          return -1;
124        }
125      if ((rs = mysql_store_result (db)) == NULL)
126        {
127          log_error ("Get user_list data failed\n");
128          return -1;
129        }
130      if (row = mysql_fetch_row (rs))
131        {
132          p_priv->g_priv |= (atoi (row[0]) ? S_POST : 0);
133          p_priv->g_priv |= (atoi (row[1]) ? S_MSG : 0);
134          p_priv->g_priv |= (atoi (row[2]) ? S_MAIL : 0);
135        }
136      mysql_free_result (rs);
137    
138      //Verified
139      sprintf (sql, "select verified from user_list where" " UID=%ld", uid);
140      if (mysql_query (db, sql) != 0)
141        {
142          log_error ("Query user_list failed\n");
143          return -1;
144        }
145      if ((rs = mysql_store_result (db)) == NULL)
146        {
147          log_error ("Get user_list data failed\n");
148          return -1;
149        }
150      if (row = mysql_fetch_row (rs))
151        p_priv->g_priv &= (atoi (row[0]) ? p_priv->g_priv : S_DEFAULT);
152      mysql_free_result (rs);
153    
154      //IP ban
155      sprintf (sql, "select begin_ip,end_ip from ban_ip_list"
156               " where ('%s' between begin_ip and end_ip) and enable",
157               hostaddr_client);
158      if (mysql_query (db, sql) != 0)
159        {
160          log_error ("Query ban_ip_list failed\n");
161          return -1;
162        }
163      if ((rs = mysql_store_result (db)) == NULL)
164        {
165          log_error ("Get ban_ip_list data failed\n");
166          return -1;
167        }
168      if (mysql_num_rows (rs) > 0)
169        p_priv->g_priv &= S_DEFAULT;
170      mysql_free_result (rs);
171    
172      //Section Class Master
173      sprintf (sql, "select SID from section_class_master"
174               " left join section_config on section_class_master.CID"
175               "=section_config.CID where UID=%ld and section_class_master.enable"
176               " and (now() between begin_dt and end_dt)", uid);
177      if (mysql_query (db, sql) != 0)
178        {
179          log_error ("Query section_class_master failed\n");
180          return -1;
181        }
182      if ((rs = mysql_store_result (db)) == NULL)
183        {
184          log_error ("Get section_class_master data failed\n");
185          return -1;
186        }
187      while (row = mysql_fetch_row (rs))
188        {
189          p_priv->level |= P_MAN_C;
190          setpriv (p_priv, atoi (row[0]), getpriv (p_priv, atoi (row[0]))
191                   | S_MAN_M);
192        }
193      mysql_free_result (rs);
194    
195      //Section Master
196      sprintf (sql, "select SID,major from section_master where"
197               " UID=%ld and enable and (now() between begin_dt and"
198               " end_dt)", uid);
199      if (mysql_query (db, sql) != 0)
200        {
201          log_error ("Query section_master failed\n");
202          return -1;
203        }
204      if ((rs = mysql_store_result (db)) == NULL)
205        {
206          log_error ("Get section_master data failed\n");
207          return -1;
208        }
209      while (row = mysql_fetch_row (rs))
210        {
211          p_priv->level |= (atoi (row[1]) ? P_MAN_M : P_MAN_S);
212          setpriv (p_priv, atoi (row[0]), getpriv (p_priv, atoi (row[0]))
213                   | (atoi (row[1]) ? S_MAN_M : S_MAN_S));
214        }
215      mysql_free_result (rs);
216    
217      //Section status
218      sprintf (sql, "select SID,exp_get,read_user_level,"
219               "write_user_level from section_config"
220               " left join section_class on section_config.CID="
221               "section_class.CID where section_config.enable and"
222               " section_class.enable order by SID");
223      if (mysql_query (db, sql) != 0)
224        {
225          log_error ("Query section_config failed\n");
226          return -1;
227        }
228      if ((rs = mysql_store_result (db)) == NULL)
229        {
230          log_error ("Get section_config data failed\n");
231          return -1;
232        }
233      while (row = mysql_fetch_row (rs))
234        {
235          if (p_priv->level < atoi (row[2]))
236            setpriv (p_priv, atoi (row[0]),
237                     getpriv (p_priv, atoi (row[0])) & (~S_LIST));
238          if (p_priv->level < atoi (row[3]))
239            setpriv (p_priv, atoi (row[0]),
240                     getpriv (p_priv, atoi (row[0])) & (~S_POST));
241          if (!atoi (row[1]))
242            setpriv (p_priv, atoi (row[0]),
243                     getpriv (p_priv, atoi (row[0])) & (~S_GETEXP));
244        }
245      mysql_free_result (rs);
246    
247      //Section User priv
248      sprintf (sql, "select SID,`read`,`write` from section_user_priv"
249               " where UID=%ld order by SID", uid);
250      if (mysql_query (db, sql) != 0)
251        {
252          log_error ("Query section_user_priv failed\n");
253          return -1;
254        }
255      if ((rs = mysql_store_result (db)) == NULL)
256        {
257          log_error ("Get section_user_priv data failed\n");
258          return -1;
259        }
260      while (row = mysql_fetch_row (rs))
261        {
262          setpriv (p_priv, atoi (row[0]),
263                   atoi (row[1]) ? (getpriv (p_priv, atoi (row[0])) | S_LIST)
264                   : (getpriv (p_priv, atoi (row[0])) & ~S_LIST));
265          setpriv (p_priv, atoi (row[0]),
266                   atoi (row[2]) ? (getpriv (p_priv, atoi (row[0])) | S_POST)
267                   : (getpriv (p_priv, atoi (row[0])) & ~S_POST));
268        }
269      mysql_free_result (rs);
270    
271      //Section ban
272      sprintf (sql, "select SID from ban_user_list where"
273               " UID=%ld and enable and unban_UID=0 and"
274               " (now() between ban_dt and unban_dt)", uid);
275      if (mysql_query (db, sql) != 0)
276        {
277          log_error ("Query ban_user_list failed\n");
278          return -1;
279        }
280      if ((rs = mysql_store_result (db)) == NULL)
281        {
282          log_error ("Get ban_user_list data failed\n");
283          return -1;
284        }
285      while (row = mysql_fetch_row (rs))
286        {
287          setpriv (p_priv, atoi (row[0]),
288                   getpriv (p_priv, atoi (row[0])) & (~S_POST));
289        }
290      mysql_free_result (rs);
291    
292      //Priv exclusion
293      p_priv->g_priv &= (~priv_excluse);
294      for (i = 0; i < p_priv->s_count; i++)
295        p_priv->s_priv_list[i].s_priv &= (~priv_excluse);
296    
297      if (priv_excluse & S_MAN_M)
298        p_priv->level &= (P_AUTH_USER | P_USER);
299    
300    return 0;    return 0;
301  }  }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

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