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