36 va_start (arg, format);
37 done = vprintf(format, arg);
52 PGresult *
PQexecCheck(
const char *desc,
char *
SQL,
char *file,
const int line)
98 if (NULL == user || NULL == password)
102 char SQL[MAXSQL] = {0};
104 char user_seed[myBUFSIZ] = {0};
105 char pass_hash_valid[myBUFSIZ] = {0};
106 unsigned char pass_hash_actual_raw[21] = {0};
107 char pass_hash_actual[41] = {0};
110 snprintf(
SQL,MAXSQL,
"SELECT user_seed, user_pass, user_perm, user_pk from users where user_name=$1;");
111 const char *values[1] = {user};
112 int lengths[1] = {strlen(user)};
114 result = PQexecParams(
pgConn,
SQL, 1, NULL, values, lengths, binary, 0);
119 if (!PQntuples(result))
123 strcpy(user_seed, PQgetvalue(result, 0, 0));
124 strcpy(pass_hash_valid, PQgetvalue(result, 0, 1));
125 *userPerm = atoi(PQgetvalue(result, 0, 2));
126 *userId = atoi(PQgetvalue(result, 0, 3));
128 if (pass_hash_valid[0] &&
129 strcmp(crypt(password, pass_hash_valid), pass_hash_valid) == 0)
133 if (user_seed[0] && pass_hash_valid[0])
135 strcat(user_seed, password);
136 gcry_md_hash_buffer(GCRY_MD_SHA1, pass_hash_actual_raw, user_seed,
144 char temp[256] = {0};
145 for (i = 0; i < 20; i++)
147 snprintf(temp, 256,
"%02x", pass_hash_actual_raw[i]);
148 strcat(pass_hash_actual, temp);
150 return (strcmp(pass_hash_valid, pass_hash_actual) == 0) ? 0 : 1;
170 if (perms < wanted_permissions)
239 snprintf(
SQL,MAXSQL,
"SELECT count(*) FROM folder JOIN users ON (users.user_pk = folder.user_fk OR users.user_perm = 10) WHERE folder_pk = %ld AND users.user_pk = %d;",folder_id,userId);
245 count = atol(PQgetvalue(result,0,0));
290 PGresult *result, *pfileResult;
291 char SQL[MAXSQL], desc[myBUFSIZ];
294 if(0 != permission_upload) {
295 return permission_upload;
298 snprintf(tempTable,
sizeof(tempTable),
"delup_%ld_pfile",uploadId);
299 snprintf(
SQL,MAXSQL,
"DROP TABLE IF EXISTS %s;",tempTable);
302 snprintf(desc, myBUFSIZ,
"Deleting upload %ld",uploadId);
316 snprintf(
SQL,MAXSQL,
"SELECT DISTINCT pfile_pk,pfile_sha1 || '.' || pfile_md5 || '.' || pfile_size AS pfile INTO %s FROM uploadtree INNER JOIN pfile ON upload_fk = %ld AND pfile_fk = pfile_pk;",tempTable,uploadId);
320 snprintf(
SQL, MAXSQL,
"DELETE FROM %s WHERE pfile_pk IN (SELECT pfile_pk FROM %s INNER JOIN uploadtree ON pfile_pk = pfile_fk WHERE upload_fk != %ld)", tempTable, tempTable, uploadId);
324 snprintf(
SQL,MAXSQL,
"SELECT COUNT(*) FROM %s;",tempTable);
329 printf(
"# Created pfile table %s with %ld entries\n", tempTable, atol(PQgetvalue(result,0,0)));
335 snprintf(
SQL,MAXSQL,
"SELECT pfile FROM %s ORDER BY pfile_pk;",tempTable);
342 maxRow = PQntuples(pfileResult);
343 for(Row=0; Row<maxRow; Row++) {
344 S = PQgetvalue(pfileResult,Row,0);
347 printf(
"TEST: Delete %s %s\n",
"files",S);
354 printf(
"TEST: Delete %s %s\n",
"gold",S);
362 PQclear(pfileResult);
373 snprintf(
SQL,MAXSQL,
"DELETE FROM foldercontents WHERE (foldercontents_mode & 2) != 0 AND child_id = %ld;",uploadId);
378 snprintf(
SQL,MAXSQL,
"DELETE FROM bucket_container USING uploadtree WHERE uploadtree_fk = uploadtree_pk AND upload_fk = %ld;",uploadId);
382 snprintf(
SQL,MAXSQL,
"DELETE FROM tag_uploadtree USING uploadtree WHERE uploadtree_fk = uploadtree_pk AND upload_fk = %ld;",uploadId);
386 snprintf(
SQL,MAXSQL,
"SELECT uploadtree_tablename FROM upload WHERE upload_pk = %ld;",uploadId);
391 if (PQntuples(result)) {
399 snprintf(
SQL, MAXSQL,
"WITH alld AS ("
400 "SELECT *, ROW_NUMBER() OVER "
401 "(PARTITION BY clearing_event_pk ORDER BY scope DESC) rnum "
402 "FROM clearing_event ce "
403 "INNER JOIN clearing_decision_event cde "
404 "ON cde.clearing_event_fk = ce.clearing_event_pk "
405 "INNER JOIN clearing_decision cd "
406 "ON cd.clearing_decision_pk = cde.clearing_decision_fk "
407 "AND cd.uploadtree_fk IN "
408 "(SELECT uploadtree_pk FROM %s WHERE upload_fk = %ld)) "
409 "DELETE FROM clearing_event ce USING alld AS ad "
410 "WHERE ad.rnum = 1 AND ad.scope = 0 "
411 "AND ce.clearing_event_pk = ad.clearing_event_pk;",
416 snprintf(
SQL, MAXSQL,
"DELETE FROM clearing_decision_event AS cde "
417 "USING clearing_decision AS cd "
418 "WHERE cd.scope = 0 "
419 "AND cd.uploadtree_fk IN "
420 "(SELECT uploadtree_pk FROM %s WHERE upload_fk = %ld) "
421 "AND cd.clearing_decision_pk = cde.clearing_decision_fk;",
426 snprintf(
SQL, MAXSQL,
"DELETE FROM clearing_decision "
427 "WHERE scope = 0 AND uploadtree_fk IN "
428 "(SELECT uploadtree_pk FROM %s WHERE upload_fk = %ld);",
433 snprintf(
SQL, MAXSQL,
"DELETE FROM license_ref_bulk "
434 "WHERE uploadtree_fk IN "
435 "(SELECT uploadtree_pk FROM %s WHERE upload_fk = %ld);",
440 snprintf(
SQL, MAXSQL,
"DELETE FROM %s WHERE upload_fk = %ld;",
451 snprintf(
SQL,MAXSQL,
"DELETE FROM pfile USING %s WHERE pfile.pfile_pk = %s.pfile_pk;",tempTable,tempTable);
454 snprintf(
SQL,MAXSQL,
"DROP TABLE %s;",tempTable);
458 snprintf(
SQL,MAXSQL,
"UPDATE upload SET expire_action = 'd', "
459 "expire_date = now(), pfile_fk = NULL WHERE upload_pk = %ld;", uploadId);
462 PQexecCheckClear(NULL,
"SET statement_timeout = 120000;", __FILE__, __LINE__);
490 int unlinkContent (
long child,
long parent,
int mode,
int userId,
int userPerm)
497 snprintf(
SQL,MAXSQL,
"SELECT COUNT(DISTINCT parent_fk) FROM foldercontents WHERE foldercontents_mode=%d AND child_id=%ld",mode,child);
500 snprintf(
SQL,MAXSQL,
"SELECT COUNT(parent_fk) FROM foldercontents WHERE foldercontents_mode=%d AND"
501 " child_id in (SELECT upload_pk FROM folderlist WHERE pfile_fk="
502 "(SELECT pfile_fk FROM folderlist WHERE upload_pk=%ld limit 1))",
510 cnt = atoi(PQgetvalue(result,0,0));
515 snprintf(
SQL,MAXSQL,
"SELECT COUNT(DISTINCT parent_fk) FROM foldercontents WHERE foldercontents_mode=1 AND child_id=%ld",parent);
521 cntUpload = atoi(PQgetvalue(result,0,0));
527 snprintf(
SQL,MAXSQL,
"DELETE FROM foldercontents WHERE foldercontents_mode=%d AND child_id =%ld AND parent_fk=%ld",mode,child,parent);
554 int r, i, rc, maxRow;
555 int count, resultUploadCount;
558 char SQL[MAXSQL], SQLUpload[MAXSQL];
559 char SQLFolder[MAXSQLFolder];
560 PGresult *result, *resultUpload, *resultFolder;
567 if(DelFlag && rc > 0){
571 snprintf(SQLFolder, MAXSQLFolder,
"SELECT COUNT(*) FROM folderlist WHERE folder_pk=%ld",Parent);
572 resultFolder = PQexec(
pgConn, SQLFolder);
573 count= atoi(PQgetvalue(resultFolder,0,0));
574 PQclear(resultFolder);
577 snprintf(
SQL,MAXSQL,
"SELECT folder_pk,foldercontents_mode,name,description,upload_pk,pfile_fk FROM folderlist WHERE parent=%ld"
578 " ORDER BY name,parent,folder_pk ", Parent);
584 maxRow = PQntuples(result);
585 for(r=0; r < maxRow; r++)
587 if (atol(PQgetvalue(result,r,0)) == Parent)
592 Fid = atol(PQgetvalue(result,r,0));
597 for(i=0; i<Depth; i++)
601 printf(
"%4ld :: %s",Fid,PQgetvalue(result,r,2));
602 Desc = PQgetvalue(result,r,3);
605 printf(
" (%s)",Desc);
614 printf(
"Deleting the folder failed.");
621 if (DelFlag==1 &&
unlinkContent(Parent,Row,1,userId,userPerm)==0)
631 snprintf(SQLUpload, MAXSQL,
"SELECT COUNT(*) FROM folderlist WHERE pfile_fk=%ld", atol(PQgetvalue(result,r,5)));
632 resultUpload = PQexec(
pgConn, SQLUpload);
633 resultUploadCount = atoi(PQgetvalue(resultUpload,0,0));
634 if(count < 2 && resultUploadCount < 2)
636 rc =
deleteUpload(atol(PQgetvalue(result,r,4)),userId, userPerm);
643 printf(
"Deleting the folder failed since it contains uploads you can't delete.");
648 rc =
unlinkContent(atol(PQgetvalue(result,r,4)),Parent,2,userId,userPerm);
663 for(i=0; i<Depth; i++)
667 printf(
"%4s :: Contains: %s\n",
"--",PQgetvalue(result,r,2));
679 printf(
"INFO: Default folder not deleted.\n");
689 printf(
"INFO: folder id=%ld will be deleted with flag %d\n",Parent,DelFlag);
703 snprintf(
SQL,MAXSQL,
"DELETE FROM foldercontents WHERE foldercontents_mode=1 AND parent_fk=%ld AND child_id=%ld",Row,Parent);
705 snprintf(
SQL,MAXSQL,
"DELETE FROM foldercontents WHERE foldercontents_mode=1 AND child_id=%ld",Parent);
708 printf(
"TEST: %s\n",
SQL);
715 snprintf(
SQL,MAXSQL,
"DELETE FROM folder f USING foldercontents fc WHERE f.folder_pk = fc.child_id AND fc.parent_fk='%ld' AND f.folder_pk = '%ld';",Row,Parent);
717 snprintf(
SQL,MAXSQL,
"DELETE FROM folder WHERE folder_pk = '%ld';",Parent);
720 printf(
"TEST: %s\n",
SQL);
744 int maxRow = PQntuples(result);
751 for(i=0; i < maxRow; i++)
753 Fid = atol(PQgetvalue(result,i,1));
759 for(j=0; (j<maxRow) && !
Match; j++)
761 if ((i!=j) && (atol(PQgetvalue(result,j,0)) == Fid))
Match=1;
763 if (!
Match && !atol(PQgetvalue(result,i,4)))
767 printf(
"# Unlinked folders\n");
770 printf(
"%4ld :: %s",Fid,PQgetvalue(result,i,2));
771 Desc = PQgetvalue(result,i,3);
774 printf(
" (%s)",Desc);
798 int maxRow = PQntuples(result);
803 for(i=0; i < maxRow; i++)
805 Fid = atol(PQgetvalue(result,i,1));
811 for(j=0; (j<maxRow) && !
Match; j++)
813 if ((i!=j) && (atol(PQgetvalue(result,j,0)) == Fid))
Match=1;
815 if (!
Match && atol(PQgetvalue(result,i,4)))
819 printf(
"# Unlinked uploads (uploads without folders)\n");
822 printf(
"%4s",PQgetvalue(result,i,4));
823 printf(
" :: %s",PQgetvalue(result,i,2));
824 Desc = PQgetvalue(result,i,3);
827 printf(
" (%s)",Desc);
849 snprintf(
SQL,MAXSQL,
"SELECT folder_pk,parent,name,description,upload_pk FROM folderlist ORDER BY name,parent,folder_pk;");
882 printf(
"you do not have the permsssion to view the folder list.\n");
886 printf(
"# Folders\n");
887 snprintf(
SQL,MAXSQL,
"SELECT folder_name from folder where folder_pk =1;");
894 printf(
"%4d :: %s\n", 1, PQgetvalue(result,0,0));
924 char *
SQL =
"SELECT upload_pk,upload_desc,upload_filename FROM upload ORDER BY upload_pk;";
925 printf(
"# Uploads\n");
933 maxRow = PQntuples(result);
934 for(Row=0; Row < maxRow; Row++)
936 NewPid = atol(PQgetvalue(result,Row,0));
943 if (NewPid >= 0 && (userPerm ==
PERM_ADMIN || rc == 0))
946 printf(
"%ld :: %s",NewPid,PQgetvalue(result,Row,2));
947 S = PQgetvalue(result,Row,1);
948 if (S && S[0]) printf(
" (%s)",S);
974 if(pFolder == 0) pFolder= -1 ;
1002 const char s[2] =
" ";
1012 if (
Verbose > 1) fprintf(stderr,
"DEBUG: Line='%s'\n",Parm);
1016 while(isspace(L[0])) L++;
1019 if (!strncasecmp(L,
"DELETE",6) && isspace(L[6]))
1024 else if (!strncasecmp(L,
"LIST",4) && isspace(L[4]))
1029 while(isspace(L[0])) L++;
1031 if (!strncasecmp(L,
"UPLOAD",6) && (isspace(L[6]) || !L[6]))
1036 else if (!strncasecmp(L,
"LICENSE",7) && (isspace(L[7]) || !L[7]))
1041 else if (!strncasecmp(L,
"FOLDER",6) && (isspace(L[6]) || !L[6]))
1049 token = strtok(a,
s);
1051 while( token != NULL )
1053 fd[i] = atol(token);
1054 token = strtok(NULL,
s);
1059 if ((Type==1) && (Target==1))
1063 else if ((Type==1) && (Target==3))
1067 else if (((Type==2) && (Target==1)) || ((Type==2) && (Target==2)))
1071 else if ((Type==2) && (Target==3))
1077 LOG_ERROR(
"Unknown command: '%s'\n",Parm);
1106 snprintf(
SQL,MAXSQL,
"SELECT user_perm FROM users WHERE user_pk='%d';", userId);
1112 userPerm = atoi(PQgetvalue(result, 0, 0));
1116 if (returnCode != 0)
1119 LOG_FATAL(
"Due to permission problems, the delagent was not able to list or delete the requested objects or they did not exist.");
1135 if (exitVal) LOG_ERROR(
"Exiting with status %d", exitVal);
char SQL[256]
SQL query to execute.
char * uploadtree_tablename
upload.uploadtree_tablename
int listFoldersFindDetatchedUploads(PGresult *result, int userId, int userPerm)
Given a PGresult, find detached uploads.
int check_permission_upload(int wanted_permissions, long uploadId, int userId, int userPerm)
check if the upload can be deleted, that is the user have the permission to delete this upload
int unlinkContent(long child, long parent, int mode, int userId, int userPerm)
remove link between parent and (child,mode) if there are other parents
int readAndProcessParameter(char *Parm, int userId, int userPerm)
Parse parameters.
void doSchedulerTasks()
process the jobs from scheduler
int check_write_permission_folder(long folder_id, int userId, int userPerm)
check if the upload can be deleted, that is the user have the permission to delete this upload
int check_write_permission_license(long license_id, int userPerm)
check if the license can be deleted, that is the user have the permission to delete this license
int listFoldersRecurse(long Parent, int Depth, long Row, int DelFlag, int userId, int userPerm)
Draw folder tree.
int authentication(char *user, char *password, int *userId, int *userPerm)
if this account is valid
PGconn * pgConn
Database connection.
int printfInCaseOfVerbosity(const char *format,...)
If verbose is on, print to stdout.
void exitNow(int exitVal)
Exit function. This does all cleanup and should be used instead of calling exit() or main() return.
void PQexecCheckClear(const char *desc, char *SQL, char *file, const int line)
Execute SQL query and create the result.
int Verbose
Verbose level.
PGresult * PQexecCheck(const char *desc, char *SQL, char *file, const int line)
simple wrapper which includes PQexec and fo_checkPQcommand
int listUploads(int userId, int userPerm)
List every upload ID.
int listFoldersFindDetatched(int userId, int userPerm)
Given a user id, find detached folders and uploads.
int listFolders(int userId, int userPerm)
List every folder.
int deleteUpload(long uploadId, int userId, int userPerm)
Given an upload ID, delete it.
int check_write_permission_upload(long uploadId, int userId, int userPerm)
check if the user has read permission on the given upload
int deleteFolder(long cFolder, long pFolder, int userId, int userPerm)
recursively delete a folder
int check_read_permission_upload(long uploadId, int userId, int userPerm)
check if the user has read permission on the given upload
int listFoldersFindDetatchedFolders(PGresult *result, int userId, int userPerm)
Given a PGresult, find detached folders.
int s
The socket that the CLI will use to communicate.
FUNCTION int getEffectivePermissionOnUpload(PGconn *pgConn, long UploadPk, int user_pk, int user_perm)
Get users permission to this upload.
int fo_checkPQresult(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres SELECT.
int fo_checkPQcommand(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres commands (not select) If an error occured, write the error to s...
#define PERM_WRITE
Read-Write permission.
#define PERM_READ
Read-only permission.
#define PERM_ADMIN
Administrator.
int fo_RepExist(char *Type, char *Filename)
Determine if a file exists.
int fo_RepRemove(char *Type, char *Filename)
Delete a repository file.
void fo_scheduler_disconnect(int retcode)
Disconnect the scheduler connection.
void fo_scheduler_heart(int i)
This function must be called by agents to let the scheduler know they are alive and how many items th...
int fo_scheduler_userID()
Gets the id of the user that created the job that the agent is running.
char * fo_scheduler_current()
Get the last read string from the scheduler.
char * fo_scheduler_next()
Get the next data to process from the scheduler.