GDBMS 1.0
|
00001 #include "maininclude.h" 00002 #include "listi.h" 00003 #include "settings.h" 00004 #include "hash_table.h" 00005 #include "tr_twin_ht.h" 00006 #include "file_semaphore.h" 00007 #include "some_functions.h" 00008 #include "initial_mode_commands.h" 00009 #include "session_mode_commands.h" 00010 #include "transaction_mode_commands.h" 00011 #include "transaction_mode_commands_types.h" 00012 #include "transaction_mode_commands_nodes.h" 00013 #include "transaction_mode_commands_edges.h" 00014 #include "transaction_mode_commands_find.h" 00015 00016 using namespace std; 00017 bool settings::is_admin(int user_id) 00018 { 00019 bool rv=false; 00020 hash_table conn("users", "admin/users", 4, "id;name;pass;gr_id", "id;name;gr_id", "id"); 00021 hash_table gr("usergroups", "admin/usergroups", 3, "id;name;admin", "id;name", "id"); 00022 char *buf; 00023 if(!conn.FindRecord("id", inttostr(user_id), "gr_id")){ 00024 //nyama takyv user 00025 return rv; 00026 00027 } 00028 char *buf1=gr.FindRecord("id", buf, "admin"); 00029 if(!strstr(buf1, "true")){ 00030 rv=true; 00031 }else{ 00032 rv=false; 00033 } 00034 return rv; 00035 00036 } 00037 00038 bool settings::logging_enabled(char* type_log) 00039 { 00040 char *buf33= new char[500]; 00041 buf33[0]=0; 00042 FILE *fp=fopen(strcat(strcat(buf33, MAINFOLDER),"admin/settings/settings.xml"), "r"); 00043 bool a=false; 00044 if(!fp) 00045 return false; 00046 XMLNode one=XMLNode::parseFile(buf33); 00047 XMLNode xNode=one.getChildNode("logging"); 00048 XMLNode two; 00049 int num=xNode.nChildNode(); 00050 int i; 00051 two=xNode.getChildNode(type_log); 00052 if(!strcmp(two.getText(), "ena")) 00053 a=true; 00054 00055 delete buf33; 00056 fclose(fp); 00057 return a; 00058 } 00059 00060 void settings::send_log(char* path_file, char* what_to_log) 00061 { 00062 FILE *fp; 00063 char *buf1=current_moment(); 00064 char *buf33=new char[1000]; 00065 buf33[0]=0; 00066 strcat(buf33, MAINFOLDER); 00067 strcat(buf33, path_file); 00068 00069 fp=fopen(buf33, "w"); 00070 if(!fp) 00071 return; 00072 00073 fprintf(fp, "%s> \t%s\n", buf1, what_to_log); 00074 delete buf33; 00075 delete buf1; 00076 fclose(fp); 00077 } 00078 00079 settings::settings() 00080 { 00081 00082 } 00083 settings::~settings() 00084 { 00085 00086 } 00087 00088 void settings::determineTransactionActionPermittion(int& permitted, int transaction_USCOREid, int rw1, int rw2, int rw3) 00089 { 00090 hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id"); 00091 hash_table grp("graphs", "admin/graphs", "id;name;description;creator_id;t_created", "id;name", "id"); 00092 char *inputtrid=0; 00093 char *foundusid=0; 00094 00095 inputtrid=inttostr(transaction_USCOREid); 00096 foundusid=trn.FindRecord("id", inputtrid, "user_id"); 00097 if(!foundusid){ 00098 //nqma takava transakciya 00099 //_param_14.retvalue=3; 00100 permitted=0; 00101 00102 if(inputtrid) 00103 delete inputtrid; 00104 return; 00105 00106 00107 } 00108 char *grid=0; 00109 hash_table users("users", "admin/users", "id;name;pass;gr_id", "id;name;gr_id", "id"); 00110 grid=users.FindRecord("id", foundusid, "gr_id"); 00111 if(!grid){ 00112 //tova ne trqbva da se slu4va 00113 //_param_14.retvalue=3; 00114 permitted=0; 00115 return; 00116 } 00117 hash_table ugroups("usergroups", "admin/usergroups", "id;name;admin", "id;name", "id"); 00118 char *adminvalue=0; 00119 adminvalue=ugroups.FindRecord("id", grid, "admin"); 00120 if(!adminvalue){ 00121 //tova ne trqbva da se slu4va 00122 // _param_14.retvalue=3; 00123 delete grid; 00124 permitted=0; 00125 return; 00126 00127 00128 } 00129 00130 if(!strstr(adminvalue, "false")){ 00131 //ne e administrator 00132 char *buf=0; 00133 buf=trn.FindRecord("id", inputtrid, "graph_id"); 00134 if(!buf){ 00135 //tova ne trqbva da se slu4va 00136 permitted=0; 00137 return; 00138 00139 } 00140 char *buf1=0; 00141 buf1=grp.FindRecord("id", buf, "creator_id"); 00142 if(!buf1){ 00143 goto define_tp_free; 00144 } 00145 string gr_dir; 00146 gr_dir+="admin"; 00147 gr_dir+=buf; 00148 hash_table grm("gr_main", gr_dir.c_str(), "id;node_maxid;edge_maxid;rights_word", "id;node_maxid", "id"); 00149 if(!strcmp(foundusid, buf1)){ 00150 //tova e syzdatel na grafa 00151 00152 char *buf3=grp.FindRecord("id", "1", "rights_word"); 00153 int rw=strtoint(buf3); 00154 if(rw & rw1){ 00155 //ima pravo 00156 permitted=1; 00157 }else{ 00158 //nqma pravo 00159 permitted=0; 00160 } 00161 }else{ 00162 //ne e syzdatel na grafa 00163 char *buf2=0; 00164 buf2=settings::getgroupid(foundusid); 00165 char *buf3=0; 00166 buf3=settings::getgroupofgraphcreator(buf); 00167 if(buf2&&buf3){ 00168 int rw=0; 00169 rw=settings::getRightsWORD(buf); 00170 00171 if(!strcmp(buf2, buf3)){ 00172 //ako e ot grupata na usera 00173 if(rw & rw2){ 00174 permitted=1; 00175 }else{ 00176 permitted=0; 00177 00178 } 00179 }else{ 00180 //ako ne e ot grupata na usera 00181 int rw=0; 00182 rw=settings::getRightsWORD(buf); 00183 if(rw & rw3){ 00184 permitted=1; 00185 }else{ 00186 permitted=0; 00187 } 00188 00189 } 00190 00191 delete buf2; 00192 delete buf3; 00193 } 00194 00195 00196 00197 } 00198 00199 00200 if(buf1) 00201 delete buf1; 00202 00203 if(buf) 00204 delete buf; 00205 00206 }else{ 00207 //e administrator 00208 permitted=1; 00209 } 00210 } 00211 00212 char* settings::getgroupid(char* userid) 00213 { 00214 hash_table us("users", "admin/users", "id;name;pass;gr_id", "id;name;gr_id", "id"); 00215 char *rv=0; 00216 us.FindRecord("id", userid, "gr_id"); 00217 00218 return rv; 00219 } 00220 00221 char* settings::getgroupofgraphcreator(char* graph_id) 00222 { 00223 char *rv=0; 00224 hash_table grp("graphs", "admin/graphs", "id;name;creator_id;t_created", "id;name", "id"); 00225 char *crid=grp.FindRecord("id", graph_id, "creator_id"); 00226 if(crid) 00227 rv=settings::getgroupid(crid); 00228 00229 return rv; 00230 } 00231 int settings::getRightsWORD(char* graph_id) 00232 { 00233 int rv=0; 00234 string folname1; 00235 folname1+="/admin"; 00236 folname1+=graph_id; 00237 hash_table gr_mainn("gr_main", folname1.c_str(), "id;node_maxid;edge_maxid;rights_word", "id;node_maxid", "id"); 00238 char *rv_str=0; 00239 rv_str = gr_mainn.FindRecord("id", "1", "rights_word"); 00240 00241 if(rv_str){ 00242 rv=strtoint(rv_str); 00243 delete rv_str; 00244 00245 } 00246 00247 } 00248 char* settings::getGraphfromTransaction(char* transaction_id) 00249 { 00250 char *rv=0; 00251 hash_table trn("transactions", "admin/transactions", "id;user_id;graph_id;time_started", "id;user_id;graph_id", "id"); 00252 char *crid=trn.FindRecord("id", transaction_id, "graph_id"); 00253 if(crid) 00254 rv=crid; 00255 00256 return rv; 00257 } 00258 00259 bool settings::is_int(char* value) 00260 { 00261 int rv=atoi(value); 00262 if(rv) 00263 return true; 00264 return false; 00265 00266 } 00267 bool settings::is_numeric(char* value) 00268 { 00269 int rv=atof(value); 00270 if(rv) 00271 return true; 00272 return false; 00273 } 00274 bool settings::is_type_path_valid(char* path, char* graph_id) 00275 { 00276 string fpth; 00277 fpth+="admin/"; 00278 fpth+=graph_id; 00279 fpth+="/gr_types"; 00280 hash_table grt("gr_types", fpth.c_str(), "id;name;parsestr;composite;array;asize;aid;internal", "id;name", "id"); 00281 int i=0, j; 00282 bool retvalue=false; 00283 int n=0; 00284 char **splitted; 00285 settings::split(path, &n, &splitted, '.'); 00286 int previt=1; 00287 for(i=0; i<n; i++){ 00288 if(!previt) 00289 break; 00290 previt=0; 00291 string buf; 00292 buf="@"; 00293 buf+=splitted[i]; 00294 int num; 00295 00296 char *buf1=new char[1000]; 00297 if(buf1){ 00298 for(j=0; j<1000; j++) 00299 buf1[j]=0; 00300 if(i<n-1){ 00301 if(sscanf(buf.c_str(), "@%s[%d]", buf1, &num)==2){ 00302 //4len na masiv e 00303 char *composite=grt.FindRecord("name", buf1, "composite"); 00304 if(composite){ 00305 if(!strcmp(composite, "2")){ 00306 char *array_size=grt.FindRecord("name", buf1, "asize"); 00307 if(array_size){ 00308 if(num<strtoint(array_size)&&num>=0){ 00309 char *aid=grt.FindRecord("name", buf1, "aid"); 00310 00311 if(aid){ 00312 char *internal1=grt.FindRecord("id", aid, "internal"); 00313 00314 if(internal1){ 00315 char *nextmemberid=grt.FindRecord("name", splitted[i+1], "id"); 00316 if(nextmemberid){ 00317 XMLNode x1, x2; 00318 x1=XMLNode::parseString(internal1); 00319 int nchild=0; 00320 nchild=x1.nChildNode("tpi"); 00321 bool foundnext=false; 00322 for(j=0; j<nchild; j++){ 00323 x2=x1.getChildNode("tpi"); 00324 char *buf2=x2.getAttribute("id"); 00325 00326 if(buf2){ 00327 if(!strcmp(buf2, nextmemberid)){ 00328 00329 foundnext=true; 00330 00331 } 00332 00333 00334 00335 delete buf2; 00336 00337 } 00338 if(foundnext) 00339 break; 00340 00341 } 00342 if(foundnext){ 00343 //dotuk dobre, prodylji natatyk 00344 previt=1; 00345 00346 } 00347 delete nextmemberid; 00348 } 00349 delete internal1; 00350 } 00351 00352 00353 delete aid; 00354 } 00355 00356 } 00357 00358 delete array_size; 00359 } 00360 } 00361 delete composite; 00362 } 00363 }else{ 00364 //ne e masiv 00365 //tryabva zadyljitelno da e struktura 00366 char *composit=grt.FindRecord("name", splitted[i], "composite"); 00367 if(composit){ 00368 if(!strcmp(composit, "1")){ 00369 //struktura e 00370 //tryabva id na tipa na sledva6tiq da go ima v spisyka v internal 00371 char *internal=grt.FindRecord("name", splitted[i], "internal"); 00372 00373 if(internal){ 00374 char *idnext=grt.FindRecord("name", splitted[i+1], "id"); 00375 XMLNode x1, x2; 00376 x1=XMLNode::parseString(internal); 00377 int nc=x1.nChildNode(); 00378 int k; 00379 for(k=0; k<nc; k++){ 00380 x2=x1.getChildNode("tpi"); 00381 if(!strcmp(x2.getAttribute("id"), idnext)){ 00382 previt=1; 00383 break; 00384 } 00385 00386 } 00387 00388 delete internal; 00389 } 00390 00391 } 00392 00393 00394 delete composit; 00395 } 00396 } 00397 00398 00399 }else{ 00400 //posledniya tip v tipoviya path 00401 00402 if(sscanf(buf.c_str(), "@%s[%d]", buf1, &num)==2){ 00403 //4len na masiv e 00404 char *array=grt.FindRecord("name", buf1, "array"); 00405 if(array){ 00406 if(!strcmp(array, "1")){ 00407 char *asize=grt.FindRecord("name", buf1, "asize"); 00408 if(asize){ 00409 if(strtoint(asize)>num){ 00410 char *aid=grt.FindRecord("name", buf1, "aid"); 00411 if(aid){ 00412 //tova e id na tipa na masiva i tryabva da se vidi, dali tozi tip vodi do stojnost 00413 char *aid_parsestr=grt.FindRecord("id", aid, "parsestr"); 00414 00415 if(aid_parsestr){ 00416 if(!(strcmp(aid_parsestr, "%d")&&strcmp(aid_parsestr, "%f")&&strcmp(aid_parsestr, "%s"))){ 00417 previt=1; 00418 } 00419 00420 delete aid_parsestr; 00421 } 00422 delete aid; 00423 } 00424 00425 } 00426 00427 delete asize; 00428 } 00429 00430 } 00431 delete array; 00432 } 00433 00434 }else{ 00435 //ne e masiv 00436 char *parsestr=grt.FindRecord("name", splitted[i], "parsestr"); 00437 if(parsestr){ 00438 if(!(strcmp(parsestr, "%d")&&strcmp(parsestr, "%f")&&strcmp(parsestr, "%s"))){ 00439 previt=1; 00440 00441 } 00442 delete parsestr; 00443 } 00444 } 00445 00446 } 00447 } 00448 00449 } 00450 if(splitted){ 00451 for(i=0; i<n; i++) 00452 if(splitted[i]) 00453 delete splitted[i]; 00454 delete splitted; 00455 } 00456 return previt; 00457 00458 } 00459 void settings::getparsestr(char* graph_id, char* path, string& return_parsestr) 00460 { 00461 string fpth; 00462 fpth+="admin/"; 00463 fpth+=graph_id; 00464 fpth+="/gr_types"; 00465 hash_table grt("gr_types", fpth.c_str(), "id;name;parsestr;composite;array;asize;aid;internal", "id;name", "id"); 00466 00467 int i=0; 00468 00469 int n=0; 00470 char **splitted; 00471 settings::split(path, &n, &splitted, '.'); 00472 string buf; 00473 buf+="@"; 00474 buf+=splitted[n-1]; 00475 char *buf1=new char[1000]; 00476 for(i=0; i<1000; i++) 00477 buf1[i]=0; 00478 int numb; 00479 if(sscanf(buf.c_str(), "@%s[%d]", buf1, &numb)==2){ 00480 //tipa e masiv 00481 char *aid=grt.FindRecord("name", buf1, "aid"); 00482 00483 if(aid){ 00484 char *parsestr=grt.FindRecord("id", aid, "parsestr"); 00485 if(parsestr){ 00486 00487 return_parsestr=parsestr; 00488 delete parsestr; 00489 }else{ 00490 return_parsestr=""; 00491 } 00492 00493 delete aid; 00494 00495 }else{ 00496 return_parsestr=""; 00497 } 00498 }else{ 00499 //trqbva da e obiknoven tip 00500 char *parsestr=grt.FindRecord("name", splitted[n-1], "parsestr"); 00501 if(parsestr){ 00502 return_parsestr=parsestr; 00503 delete parsestr; 00504 }else{ 00505 return_parsestr=""; 00506 } 00507 } 00508 if(splitted){ 00509 for(i=0; i<n; i++) 00510 if(splitted[i]) 00511 delete splitted[i]; 00512 delete splitted; 00513 } 00514 00515 00516 delete buf1; 00517 00518 } 00519 00520 void settings::split(char* str, int* numbers_splitted, char*** splitted, char delimeter) 00521 { 00522 int i; 00523 int j=0; 00524 00525 for(i=0; i<strlen(str); i++) 00526 if(str[i]==';') 00527 j++; 00528 00529 j++; 00530 char **a=new char *[j]; 00531 *numbers_splitted=j; 00532 *splitted=a; 00533 int iprev=0; 00534 int ispl=0; 00535 int N=strlen(str); 00536 00537 for(i=0; i<N; i++){ 00538 if(str[i]==delimeter){ 00539 str[i]=0; 00540 a[ispl]=new char[strlen(str+iprev)+2]; 00541 a[ispl][0]=0; 00542 strcpy(a[ispl], str+iprev); 00543 ispl++; 00544 iprev=i+1; 00545 00546 } 00547 00548 } 00549 str[i]=0; 00550 a[ispl]=new char[strlen(str+iprev)+2]; 00551 a[ispl][0]=0; 00552 strcpy(a[ispl], str+iprev); 00553 ispl++; 00554 iprev=i+1; 00555 00556 00557 }