00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
00105 tmp = root_node;
00106 while(tmp->child != NULL) {
00107 if (tmp->id == gid) {
00108
00109 mgd_free_pool(pool);
00110 return 0;
00111 }
00112
00113 tmp = tmp->child;
00114 }
00115
00116
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
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
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
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
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
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
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
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
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;
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
00444 return mgd_ispageowner(mgd, id);
00445 #if HAVE_MIDGARD_MULTILANG
00446 }
00447 #endif
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