src/access.c

00001 /* $Id: access.c,v 1.17 2006/05/30 14:20:09 piotras Exp $
00002  *
00003  * Copyright (C) 1999 Jukka Zitting <jukka.zitting@iki.fi>
00004  * Copyright (C) 2000 The Midgard Project ry
00005  * Copyright (C) 2000 Emiliano Heyns, Aurora SA
00006  * Copyright (C) 2003 David Schmitter, Dataflow Solutions GmbH <schmitt@dataflow.ch>
00007  *
00008  * This program is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * This program is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with this program; if not, write to the Free Software
00020  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  */
00022 
00023 #include <config.h>
00024 #include "midgard/midgard_legacy.h"
00025 #include "midgard/tablenames.h"
00026 
00027 int mgd_istopicreader(midgard *mgd, int topic)
00028 {
00029         int reader;
00030 
00031         if (mgd_isadmin(mgd))
00032                 return 1;
00033 
00034         while (topic) {
00035                 reader = mgd_idfield(mgd, "reader", "topic", topic);
00036                 if (reader)
00037                         return mgd_ismember(mgd, reader);
00038                 topic = mgd_idfield(mgd, "up", "topic", topic);
00039         }
00040 
00041         return 1;
00042 }
00043 
00044 int mgd_isarticlereader(midgard *mgd, int article)
00045 {
00046         return
00047            mgd_istopicreader(mgd, mgd_idfield
00048                          (mgd, "topic", "article", article));
00049 }
00050 
00051 int mgd_istopicowner(midgard *mgd, int topic)
00052 {
00053         if (mgd_isadmin(mgd))
00054                 return 1;
00055 
00056         for (; topic; topic = mgd_idfield(mgd, "up", "topic", topic))
00057                 if (mgd_ismember(mgd,
00058                                  mgd_idfield(mgd, "owner", "topic",
00059                                              topic))) return 1;
00060 
00061         return 0;
00062 }
00063 
00064 int mgd_issnippetdirowner(midgard *mgd, int snippetdir)
00065 {
00066         if (mgd_isadmin(mgd))
00067                 return 1;
00068 
00069         for (; snippetdir;
00070              snippetdir =
00071              mgd_idfield(mgd, "up", "snippetdir",
00072                          snippetdir)) if (mgd_ismember(mgd,
00073                                                        mgd_idfield(mgd, "owner",
00074                                                                    "snippetdir",
00075                                                                    snippetdir)))
00076                            return 1;
00077 
00078         return 0;
00079 }
00080 
00081 /* Allocate and initialize a Midgard tree node */
00082 #define GRP_ALLOC_TNODE(pool, node) {\
00083   (node) = (grp_tree_node*)mgd_alloc(pool, sizeof(grp_tree_node));\
00084   *(node) = grp_zero_node;\
00085 }
00086 const grp_tree_node grp_zero_node = { 0, NULL, };
00087 
00088 int mgd_isgroupowner(midgard *mgd, int gid)
00089 {
00090 midgard_pool *pool;
00091 grp_tree_node *node, *root_node, *tmp;
00092 int nodes;
00093 pool = mgd_alloc_pool();
00094 GRP_ALLOC_TNODE(pool, root_node);
00095 nodes=0;
00096 
00097         if (mgd_isadmin(mgd))
00098                 return 1;
00099 
00100    for (; gid; gid = mgd_idfield(mgd, "owner", "grp", gid)) {
00101       if (mgd_ismember(mgd, gid)) {
00102          return 1;
00103       } else {    
00104          /* look for it in the grp tree node array */
00105          tmp = root_node;
00106          while(tmp->child != NULL) {
00107             if (tmp->id == gid) {
00108                /* found it already! */
00109                mgd_free_pool(pool);
00110                return 0;
00111             }
00112 
00113             tmp = tmp->child;
00114          }
00115 
00116          /* ADD A NODE! */
00117          GRP_ALLOC_TNODE(pool, node);       
00118          tmp->id = gid;
00119          tmp->child = node;
00120       }      
00121    }
00122 
00123         return 0;
00124 }
00125 
00126 int mgd_isgroupreader(midgard *mgd, int gid)
00127 {
00128         return mgd_isadmin(mgd)
00129            || mgd_ismember(mgd,
00130                            mgd_idfield(mgd, "owner", "grp", gid))
00131            || mgd_ismember(mgd,
00132                            mgd_idfield(mgd, "reader", "grp", gid));
00133 }
00134 
00135 int mgd_isuserowner(midgard *mgd, int uid)
00136 {
00137         if (mgd_isadmin(mgd)) return 1;
00138    
00139    if (mgd_isuser(mgd, uid)) return 1;
00140 
00141    /* is user owner if owner of one of the groups 'uid' is member from
00142     */
00143         if (mgd_exists_bool(mgd, "member,grp",
00144                          "uid=$d AND gid=grp.id AND grp.owner IN $D"
00145                          " AND grp.sitegroup IN (0,$d)"
00146                          , uid, mgd_groups(mgd)
00147                         ,mgd->current_user->sitegroup
00148                 )) return 1;
00149 
00150    /* is user owner if creator of 'uid' and 'uid' has no username
00151     */
00152    if (mgd_exists_bool(mgd, "person",
00153             "id=$d AND creator=$d AND username=''"
00154             " AND sitegroup IN (0,$d)"
00155             , uid, mgd->current_user->id
00156             ,mgd->current_user->sitegroup
00157       )) return 1;
00158 
00159    return 0;
00160 }
00161 
00162 #if HAVE_MIDGARD_PAGELINKS
00163 /* pagelink */
00164 int mgd_ispagelinkowner(midgard *mgd, int pagelink)
00165 {
00166         if (mgd_isadmin(mgd))
00167                 return 1;
00168         if (mgd_exists_id(mgd, "pagelink", "id=$d AND owner IN $D",
00169                        pagelink, mgd_groups(mgd)))
00170                 return 1;
00171 
00172         return
00173            mgd_ispageowner(mgd, mgd_idfield(mgd, "up", "pagelink", pagelink));
00174 }
00175 #endif
00176 
00177 int mgd_isarticleowner(midgard *mgd, int article)
00178 {
00179         int topic, locker, author;
00180 
00181         if (mgd_isadmin(mgd))
00182                 return 1;
00183 
00184         locker = mgd_idfield(mgd, "locker", "article", article);
00185         if (locker)
00186                 return mgd_isuser(mgd, locker);
00187 
00188         author = mgd_idfield(mgd, "author", "article", article);
00189         if (mgd_isuser(mgd, author))
00190                 return 1;
00191 
00192         topic = mgd_idfield(mgd, "topic", "article", article);
00193         while (topic) {
00194                 if (mgd_ismember(mgd,
00195                                  mgd_idfield(mgd, "owner", "topic",
00196                                              topic))) return 1;
00197                 topic = mgd_idfield(mgd, "up", "topic", topic);
00198         }
00199 
00200         return 0;
00201 }
00202 
00203 int mgd_iseventowner(midgard *mgd, int event)
00204 {
00205         int parent, locker, creator;
00206 
00207         if (mgd_isadmin(mgd))
00208                 return 1;
00209 
00210         locker = mgd_idfield(mgd, "locker", "event", event);
00211         if (locker)
00212                 return mgd_isuser(mgd, locker);
00213 
00214         creator = mgd_idfield(mgd, "creator", "event", event);
00215         if (mgd_isuser(mgd, creator))
00216                 return 1;
00217 
00218         parent = event;
00219         while (parent) {
00220                 if (mgd_ismember(mgd, mgd_idfield(mgd, "owner", "event", parent)))
00221                         return 1;
00222                 parent = mgd_idfield(mgd, "up", "event", parent);
00223         }
00224 
00225         return 0;
00226 }
00227 
00228 int mgd_ishostowner(midgard *mgd, int host)
00229 {
00230         return mgd_isadmin(mgd)
00231            || mgd_ismember(mgd,
00232                            mgd_idfield(mgd, "owner", "host", host));
00233 }
00234 
00235 int mgd_ispageowner(midgard *mgd, int page)
00236 {
00237         if (mgd_isadmin(mgd))
00238                 return 1;
00239 
00240    if (mgd_exists_id(mgd, "page", "id=$d AND author=$d", page, mgd_user(mgd)))
00241       return 1;
00242 
00243         while (page) {
00244 #if HAVE_MIDGARD_PAGE_OWNER
00245           if (mgd_exists_id(mgd, "page", "id=$d AND owner != 0", page)) {
00246             if (mgd_exists_id(mgd, "page", "id=$d AND owner IN $D", page, mgd_groups(mgd)))
00247               return 1;
00248             else 
00249               return 0;
00250           }
00251 #endif /* HAVE_MIDGARD_PAGE_OWNER */
00252                 if (mgd_exists_id(mgd, "host", "root=$d AND owner IN $D",
00253                                page, mgd_groups(mgd)))
00254                         return 1;
00255                 page = mgd_idfield(mgd, "up", "page", page);
00256         }
00257         return 0;
00258 }
00259 
00260 #if HAVE_MIDGARD_MULTILANG
00261 int mgd_ispagecontentowner(midgard *mgd, int page, int lang) {
00262   int my_page = page;
00263   if (mgd_isadmin(mgd))
00264     return 1;
00265   if (mgd_exists_id(mgd, "page_i", "sid=$d AND lang=$d AND author=$d", page, lang, mgd_user(mgd)))
00266     return 1;
00267   
00268   
00269   while (page) {
00270     if (mgd_exists_id(mgd, "page_i", "sid=$d AND lang=$d AND owner != 0", page, lang)) {
00271       if (mgd_exists_id(mgd, "page_i", "sid=$d AND lang=$d AND owner IN $D", page, lang, mgd_groups(mgd)))
00272         return 1;
00273       else 
00274         return 0;
00275     }
00276     page = mgd_idfield(mgd, "up", "page", page);
00277   }
00278   
00279   page = my_page;
00280 
00281   while (page) {
00282     if (mgd_exists_id(mgd, "page", "id=$d AND owner != 0", page)) {
00283       if (mgd_exists_id(mgd, "page", "id=$d AND owner IN $D", page, mgd_groups(mgd)))
00284         return 1;
00285       else 
00286         return 0;
00287     }
00288 
00289     if (mgd_exists_id(mgd, "host", "root=$d AND owner IN $D",
00290                       page, mgd_groups(mgd)))
00291       return 1;
00292     page = mgd_idfield(mgd, "up", "page", page);
00293   }
00294 
00295   return 0;
00296   
00297 }
00298 
00299 
00300 #endif /* HAVE_MIDGARD_MULTILANG */
00301 int mgd_isstyleowner(midgard *mgd, int style)
00302 {
00303    if (mgd_isadmin(mgd)) return 1;
00304 
00305    if (mgd_exists_id(mgd, "style", "id=$d AND owner IN $D", style, mgd_groups(mgd))) return 1;
00306 
00307    style = mgd_idfield(mgd, "up", "style", style);
00308    while (style != 0) {
00309       if (mgd_exists_id(mgd, "style", "id=$d AND owner IN $D", style, mgd_groups(mgd))) return 1;
00310    }
00311 
00312    return 0;
00313 }
00314 
00315 int mgd_lookup_table_id(const char *table)
00316 {
00317         int s = 1;
00318         int e = MIDGARD_OBJECT_COUNT;
00319         int c;
00320         int i;
00321 
00322         while (s <= e) {
00323                 i = s + ((e - s) / 2);
00324                 c = strcmp(table, mgd_table_name[i]);
00325 
00326                 if (c == 0)
00327                         return i;
00328                 if (c < 0)
00329                         e = i - 1;
00330                 else
00331                         s = i + 1;
00332         }
00333 
00334         return 0;
00335 }
00336 
00337 #if ! HAVE_MIDGARD_MULTILANG
00338 int mgd_global_is_owner_ex(midgard *mgd, int table, int id, int dbg)
00339 #else /* HAVE_MIDGARD_MULTILANG */
00340 int mgd_global_is_owner(midgard *mgd, int table, int id) {
00341   return mgd_global_is_owner_ex(mgd, table, id, 0);
00342 }
00343 
00344 
00345 int mgd_global_is_owner_ex(midgard *mgd, int table, int id, int dbg) { 
00346   return mgd_global_is_owner_ex_lang(mgd, table, id, dbg, 0, 0);
00347 }
00348 
00349 int mgd_global_is_owner_lang(midgard *mgd, int table, int id, int content, int lang) { 
00350   return mgd_global_is_owner_ex_lang(mgd, table, id, 0, content, lang);
00351 }
00352 
00353 int mgd_global_is_owner_ex_lang(midgard *mgd, int table, int id, int dbg, int content, int lang)
00354 #endif /* HAVE_MIDGARD_MULTILANG */
00355 {
00356         midgard_res *res;
00357         int owner;
00358    int switched = 1;
00359 
00360         if (mgd_isadmin(mgd))
00361                 return 1;
00362 
00363         switch (table) {
00364                 case MIDGARD_OBJECT_PAGEELEMENT:
00365                         table = MIDGARD_OBJECT_PAGE;
00366                         id = mgd_idfield(mgd, "page", "pageelement", id);
00367                         break;
00368 
00369                 case MIDGARD_OBJECT_ELEMENT:
00370                         table = MIDGARD_OBJECT_STYLE;
00371                         id = mgd_idfield(mgd, "style", "element", id);
00372                         break;
00373 
00374                 case MIDGARD_OBJECT_MEMBER:
00375                         /* EEH: is this right or should we use info == 'owner'? */
00376                         table = MIDGARD_OBJECT_GRP;
00377                         id = mgd_idfield(mgd, "gid", "member", id);
00378                         break;
00379 
00380                 case MIDGARD_OBJECT_EVENTMEMBER:
00381                         table = MIDGARD_OBJECT_EVENT;
00382                         id =
00383                            mgd_idfield(mgd, "eid", "eventmember", id);
00384                         break;
00385 
00386                 case MIDGARD_OBJECT_PREFERENCE:
00387                         table = MIDGARD_OBJECT_PERSON;
00388                         id =
00389                            mgd_idfield(mgd,  "uid","preference", id);
00390                         break;
00391 
00392                 case MIDGARD_OBJECT_FILE:
00393                         table = MIDGARD_OBJECT_ARTICLE;
00394                         id = mgd_idfield(mgd, "article", "file", id);
00395                         break;
00396 
00397                 case MIDGARD_OBJECT_SNIPPET:
00398                         table = MIDGARD_OBJECT_SNIPPETDIR;
00399                         id = mgd_idfield(mgd, "up", "snippet", id);
00400                         break;
00401 
00402       default:
00403          switched = 0;
00404          break;
00405         }
00406 
00407    if (dbg && switched) {
00408       fprintf(stderr, "Dependant resource, checking %s %d instead\n",
00409          mgd_table_name[table], id);
00410    }
00411 
00412         switch (table) {
00413                 case MIDGARD_OBJECT_SITEGROUP:
00414                         return mgd_isroot(mgd);
00415 
00416                 case MIDGARD_OBJECT_IMAGE:
00417                         return 1;       /* EEH: no ownership seems to exist */
00418                 case MIDGARD_OBJECT_HOST:
00419                         return mgd_ishostowner(mgd, id);
00420 
00421                 case MIDGARD_OBJECT_GRP:
00422                         return mgd_isgroupowner(mgd, id);
00423 
00424                 case MIDGARD_OBJECT_PERSON:
00425                         return mgd_isuserowner(mgd, id);
00426 
00427                 case MIDGARD_OBJECT_TOPIC:
00428                         return mgd_istopicowner(mgd, id);
00429 
00430                 case MIDGARD_OBJECT_ARTICLE:
00431                         return mgd_isarticleowner(mgd, id);
00432 
00433                 case MIDGARD_OBJECT_EVENT:
00434                         return mgd_iseventowner(mgd, id);
00435 
00436                 case MIDGARD_OBJECT_PAGE:
00437 #if HAVE_MIDGARD_MULTILANG
00438                   if (content == 1) { 
00439                     return mgd_ispageowner(mgd, id) && mgd_ispagecontentowner(mgd, id, lang);
00440                   } else if (content == 2) {
00441                     return mgd_ispagecontentowner(mgd, id, lang);
00442                   } else {
00443 #endif /* HAVE_MIDGARD_MULTILANG */
00444                         return mgd_ispageowner(mgd, id);
00445 #if HAVE_MIDGARD_MULTILANG
00446                   }
00447 #endif /* HAVE_MIDGARD_MULTILANG */
00448 
00449 #if HAVE_MIDGARD_PAGELINKS
00450                 case MIDGARD_OBJECT_PAGELINK:
00451                         return mgd_ispagelinkowner(mgd, id);
00452 #endif
00453 
00454                 case MIDGARD_OBJECT_STYLE:
00455                         return mgd_isstyleowner(mgd, id);
00456 
00457                 case MIDGARD_OBJECT_SNIPPETDIR:
00458                         return mgd_issnippetdirowner(mgd, id);
00459 
00460                 case MIDGARD_OBJECT_RECORD_EXTENSION:
00461                 case MIDGARD_OBJECT_BLOBS:
00462                   if (table == MIDGARD_OBJECT_BLOBS) {
00463 #if HAVE_MIDGARD_MULTILANG
00464                     res =
00465                       mgd_sitegroup_record(mgd,
00466                                            "ptable,pid,lang", "blobs",
00467                                                         id);
00468 #else
00469                                 res =
00470                                    mgd_sitegroup_record(mgd,
00471                                                         "ptable,pid", "blobs",
00472                                                         id);
00473 #endif
00474                   } else {
00475 #if HAVE_MIDGARD_MULTILANG
00476                     res =
00477                       mgd_sitegroup_record(mgd,
00478                                            "tablename,oid,lang",
00479                                            "record_extension", id);
00480 #else
00481                                 res =
00482                                    mgd_sitegroup_record(mgd,
00483                                                         "tablename,oid",
00484                                                         "record_extension", id);
00485 #endif
00486                   }
00487                         if (!res || !mgd_fetch(res)) {
00488                                 if (res)
00489                                         mgd_release(res);
00490                                 return 0;
00491                         }
00492 
00493                         table = mgd_lookup_table_id(mgd_colvalue(res, 0));
00494                         id = mgd_sql2id(res, 1);
00495 #if HAVE_MIDGARD_MULTILANG
00496                         lang = mgd_sql2id(res, 2);
00497                         owner = mgd_global_is_owner_lang(mgd, table, id, 2, lang);
00498 #else 
00499                         owner = mgd_global_is_owner(mgd, table, id);
00500 #endif
00501                         mgd_release(res);
00502                         return owner;
00503         }
00504 
00505         return 0;
00506 }
00507 
00508 

Generated on Thu Feb 22 06:15:14 2007 for midgard-core by  doxygen 1.4.6