const char *set_get_value(struct opt_set *set, const char *user) { struct opt_set *p = set; char *key; int match = 0; if (!user || !set) { return NULL; } while (p) { key = p->key; if (*key != '@') { //user if (0 == strcmp(key, user)) { match = 1; } } else if (*(key+1) == '\0') { /* "@" match all */ match = 1; } else { /* Group */ if (is_user_in_group(user, key + 1)) { match = 1; } } if (match) { return p->value; } p = p->next; } return NULL; }
static int db_can_write_to_directory(backend_store_interface* i, const char* rel_path) { size_t end = strlen(rel_path) - 1; char dir_path[end + 2]; strncpy(dir_path, rel_path, end + 2); logger_logf(LOG(i), "rel_path = %s, dir_path = %s", rel_path, dir_path); /* Need to make sure user can write to all directories above this one */ while (end > 0) { while (dir_path[end] != '/') { --end; } dir_path[end] = '\0'; if (end == 0) { break; } long dir_mode = get_mode(dir_path); long dir_uid = get_uid(dir_path); long dir_gid = get_gid(dir_path); int can_user_write_to_dir = fuse_get_context()->uid == dir_uid && (dir_mode & S_IWUSR); int can_grp_write_to_dir = is_user_in_group(i, dir_gid) && (dir_mode & S_IWGRP); if (!can_user_write_to_dir && !can_grp_write_to_dir) { return 0; } --end; } return 1; }
// CheckPermissions status_t Node::CheckPermissions(int mode) const { int userPermissions = (fMode & S_IRWXU) >> 6; int groupPermissions = (fMode & S_IRWXG) >> 3; int otherPermissions = fMode & S_IRWXO; // get the permissions for this uid/gid int permissions = 0; uid_t uid = geteuid(); // user is root if (uid == 0) { // root has always read/write permission, but at least one of the // X bits must be set for execute permission permissions = userPermissions | groupPermissions | otherPermissions | ACCESS_R | ACCESS_W; // user is node owner } else if (uid == fUID) permissions = userPermissions; // user is in owning group else if (is_user_in_group(fGID)) permissions = groupPermissions; // user is one of the others else permissions = otherPermissions; // do the check return ((mode & ~permissions) ? B_NOT_ALLOWED : B_OK); }
/** * Is the user allowed to see ("ascertain") if the passed file exists? * If not, then they shouldn't see it when they "ls" * * You can ascertain the existence of a file if you have have privileges to read it */ static int db_can_ascertain_existence(backend_store_interface* i, const char* rel_path) { logger_logf(LOG(i), "rel_path: %s", rel_path); //if world can read, return true no matter what if ((get_mode(rel_path) & S_IROTH) != 0) { return 1; } return (get_uid(rel_path) == fuse_get_context()->uid || is_user_in_group(i, get_gid(rel_path))); }
bool fuh::user_is_moderator(const std::string& name) { if(!user_exists(name)) return false; try { return get_writable_detail_for_user<int>(name, "user_is_moderator") == 1 || is_user_in_group(name, mp_mod_group_); } catch (const sql_error& e) { ERR_UH << "Could not query user_is_moderator/MP Moderators group for user '" << name << "' :" << e.message << std::endl; // If the database is down mark nobody as a mod return false; } }
static int db_can_read(backend_store_interface* i, const char* rel_path) { logger_logf(LOG(i), "rel_path = %s", rel_path); if (!db_can_ascertain_existence(i, rel_path)) { return 0; } long mode = get_mode(rel_path); if (mode & S_IROTH) { return 1; } if (get_uid(rel_path) == fuse_get_context()->uid && (mode & S_IRUSR)) { return 1; } if (is_user_in_group(i, get_gid(rel_path)) && (mode & S_IRGRP)) { return 1; } return 0; }
void main_loop(pDataStruct workingData){ char *commandList[] = {"set", "get", "add", "delete","exit","help","ls","cat","cd"}; char *setList[] = {"date", "user", "group","help"}; char *getList[] = {"date", "user", "group", "workingDir","help", "userlist", "grouplist", "usersingroup"}; char *addList[] = {"user", "group", "file", "directory", "usertogroup","perm", "appendfile","help"}; char *deleteList[] = {"user", "group", "file", "directory", "usertogroup","perm", "filebytes","help"}; char arg[16][MAXCOMMAND]; char command[MAXCOMMAND]; int argnum, i, j, tempNum, cmd, size; char *c; char temp[MAXPATH]; char *tempBuf; unsigned char *rcvBuf; pNode tempNode = NULL; pUser tempUser = NULL; pGroup tempGroup = NULL; pFile tempFile = NULL; pPerms tempPerms = NULL; pFileChunk tempFileChunk = NULL; pGroupUserList tempGroupUserList = NULL; while(1){ argnum = i = j = tempNum = cmd = 0; c = 0; bzero(temp, sizeof(temp)); tempBuf = NULL; tempNode = NULL; tempUser = NULL; tempGroup = NULL; tempFile = NULL; tempPerms = NULL; tempFileChunk = NULL; tempGroupUserList = NULL; bzero(command, sizeof(command)); print_prompt(workingData); get_string(command, MAXCOMMAND-1, ""); for (j = 0;j<16;j++){ bzero(arg[j],MAXCOMMAND); } argnum = parse_arg(arg, command); tempNum = 0; cmd = 100; for (i=0;i<sizeof(commandList)/4;i++){ if (strcmp(commandList[i],arg[0]) == 0 ){ cmd = i; } } switch(cmd) { case 0x0 : //set cmd = 100; for (i=0;i<sizeof(setList)/4;i++){ if (strcmp(setList[i],arg[1]) == 0){ cmd = i; } } switch(cmd) { case 0 : //set date workingData->date = get_time(); break;//end set date case 1 : //set user if ( strcmp(arg[2],"") == 0){ puts("missing user name or number"); break; } tempUser = find_user(arg[2],workingData); if ( tempUser != NULL ){ workingData->currentUser = tempUser; } else { printf("unknown user: @s\n",arg[2]); } break;//end set user case 2 : //set group if ( strcmp(arg[2], "") == 0){ puts("missing group name or number"); break; } tempGroup = find_group(arg[2], workingData); if ( tempGroup != NULL){ workingData->currentGroup = tempGroup; } else { printf("unknown group: @s\n",arg[2]); } break; case 3 : //set help print_help(setList,(sizeof(setList)/4)); break;//end set help default : printf("Invalid command: @s\n",arg[1]); } break;//end set case 1 ://get cmd = 100; for (i=0;i<sizeof(getList)/4;i++){ if (strcmp(getList[i],arg[1]) == 0){ cmd = i; } } switch(cmd) { case 0 : //get date strofdate( workingData->date); break;//end get date case 1 : //get user printf("@s\n",workingData->currentUser->name); break;//end get user case 2 : //get group printf("@s\n",workingData->currentGroup->name); break;//end get group case 3 : //get workingDir bzero(temp,MAXPATH); str_of_path( temp, workingData, workingData->workingDir); printf("@s/\n",temp); break;//end get workingDir case 4 : //get help print_help(getList,(sizeof(getList)/4)); break;//end get help case 5 : //get userlist print_user_list(workingData); break;//end get userlist case 6 : //get grouplist print_group_list(workingData); break;//end get grouplist case 7 : //get usersingroup if ( strcmp(arg[2], "") == 0){ puts("missing group name or number"); break; } tempGroup = find_group(arg[2], workingData); if ( tempGroup != NULL ){ print_users_in_group(tempGroup); break; } printf("unknown group: @s\n",arg[2]); break;//end get useringroup default : printf("Invalid command: @s\n",arg[1]); } break;//end get case 2 ://add cmd = 100; for (i=0;i<sizeof(addList)/4;i++){ if ( strcmp(addList[i],arg[1]) == 0 ){ cmd = i; } } switch(cmd) { case 0 : //add user if ( strcmp(arg[2],"") == 0 ){ bzero(temp,MAXPATH); get_string(temp, 128, "UserName"); strcpy(arg[2],temp); } tempUser = find_user( arg[2], workingData); if ( tempUser == NULL ){ add_user( arg[2], workingData ); } else { puts("Username already in use"); } break;//end add user case 1 : //add group if ( strcmp(arg[2],"") == 0 ){ bzero(temp,MAXPATH); get_string(temp, 128, "GroupName"); strcpy(arg[2], temp); } tempGroup = find_group( arg[2], workingData); if ( tempGroup == NULL ){ add_group( arg[2], workingData ); } else { puts("Groupname already in use"); } break;//end add group case 2 : //add file //add file name size tempNum = atoi(arg[3]); if (strcmp(arg[2],"") == 0){ puts("Filename required"); break; } if ( tempNum > MAXUPLOAD ){ puts("Too big"); break; } if ( find_node_by_name(arg[2],workingData->workingDir->directoryHeadNode) != NULL ){ puts("There is another file or directory with that name"); break; } if ( tempNum > 0){ rcvBuf = mallocOrDie(tempNum,"Failed to allocate tempBuf"); puts("-----Begin File-----");//five - if ( tempNum != receive_bytes(rcvBuf,tempNum) ){ die("Failed to reveive file"); break; } } else {rcvBuf = NULL;} tempNode = add_file( workingData->workingDir, workingData->date, tempNum, arg[2], (char *)rcvBuf, workingData->currentUser ); break;//end add file case 3 : //add directory if (strcmp(arg[2],"") == 0){ puts("Directory name required"); break; } if ( find_node_by_name(arg[2],workingData->workingDir->directoryHeadNode) != NULL ){ puts("There is another file or directory with that name"); break; } tempNode = add_directory( workingData->date, arg[2], workingData->workingDir, workingData->currentUser ); break;//end add directory case 4 : //add useringroup if (strcmp(arg[2],"") == 0){ puts("username or number required"); break; } tempUser = find_user( arg[2], workingData); if ( tempUser != NULL ){//user exists tempGroupUserList = is_user_in_group( tempUser, workingData->currentGroup ); if ( tempGroupUserList == NULL ){//user is not already in group add_user_to_group( tempUser, workingData->currentGroup ); } else {printf("@s is already in @s\n",arg[2], workingData->currentGroup->name);} } else { puts("User does not exist, add user first"); } break;//end add useringroup case 5 : //add perm if ( ( strcmp(arg[2],"") == 0 )||( strcmp(arg[2]," ") == 0 ) ){//arg[2] name of file or dir puts("name of file or directory required"); break; } if (!( (strcmp(arg[3],"user") == 0) ^ (strcmp(arg[3],"group") == 0) )) {//arg[3] user, group puts("'user' or 'group'"); break; } if (strcmp(arg[4],"") == 0){ puts("user name, group name, or number required");//arg[4] name or number of user or group break; } tempNode = find_node_by_name(arg[2],workingData->workingDir->directoryHeadNode );//validate file or dir if (tempNode == NULL){ puts("Invalid file or directory"); break; } if (tempNode->type == LINK){ tempNode = tempNode->directoryHeadNode; break; } if (strcmp(arg[3],"user") == 0){ tempUser = find_user(arg[4],workingData); tempGroup = NULL; if (tempUser == NULL){ printf("user @s not found\n",arg[4]); break; } } else { tempGroup = find_group(arg[4],workingData); tempUser = NULL; if (tempGroup == NULL){ printf("group @s not found\n",arg[4]); break; } } validate_current_perms(tempNode, workingData); tempPerms = add_perm(tempUser, tempGroup, tempNode ); break;//end add perm case 6 : //add appendfile tempNum = atoi(arg[3]); if (strcmp(arg[2],"") == 0){ puts("Filename required"); break; } if ( tempNum > MAXUPLOAD ){ puts("Too big"); break; } tempFile = find_file_by_name(arg[2],workingData->workingDir); if ( tempFile == NULL ){ puts("No file in working directory by that name"); break; } if ( tempNum > 0){ tempBuf = mallocOrDie(tempNum,"Failed to allocate tempBuf"); puts("-----Begin File-----");//five - if ( tempNum != receive_bytes((unsigned char *)tempBuf,tempNum) ){ die("Failed to reveive file"); break; } } else { tempBuf = NULL; puts("Can not add 0 bytes to file"); break; } tempFileChunk = add_file_chunk( tempBuf, tempFile, tempNum ); break;//end add appendfile case 7 : //add help print_help(addList, (sizeof(addList)/4)); break;//end add help default : printf("Invalid command: @s\n",arg[1]); } break;//end add case 3 ://delete cmd = 100; for (i=0;i<sizeof(deleteList)/4;i++){ if ( strcmp(deleteList[i],arg[1]) == 0 ){ cmd = i; } } switch(cmd) { case 0 : //delete user bzero(temp,MAXPATH); if ( strcmp(arg[2],"") == 0 ){ get_string(temp, 128, "User Name or number"); strcpy(arg[2],temp); } tempUser = find_user( arg[2], workingData); if ( tempUser != NULL ){ remove_user(tempUser , workingData ); } else { puts("No such user found"); } break;//end delete user case 1 : //delete group bzero(temp,MAXPATH); if ( strcmp(arg[2],"") == 0 ){ get_string(temp, 128, "Group Name or number"); strcpy(arg[2],temp); } tempGroup = find_group( arg[2], workingData); if ( tempGroup != NULL ){ remove_group(tempGroup , workingData ); } else { puts("no such group found"); } break;//end delete group case 2 : //delete file if (strcmp(arg[2],"") == 0){ puts("Filename required"); break; } tempNode = find_file_node_by_name(arg[2],workingData->workingDir); if (tempNode == NULL){ puts("No such file"); break; } delete_node(tempNode, workingData); break;//end delete file case 3 : //delete directory if (strcmp(arg[2],"") == 0){ puts("Directory name required"); break; } tempNode = find_directory_by_name(arg[2],workingData->workingDir); if (tempNode == NULL){ puts("No such directory"); break; } delete_node(tempNode, workingData); break;//end delete directory case 4 : //delete usertogroup if (strcmp(arg[2],"") == 0){ puts("User name required"); break; } if (strcmp(arg[3],"") == 0){ puts("group name required"); break; } tempUser = find_user(arg[2],workingData); if (tempUser == NULL){ puts("No such user"); break; } tempGroup = find_group(arg[3],workingData); if (tempGroup == NULL){ puts("No such group"); break; } tempGroupUserList = is_user_in_group(tempUser, tempGroup); if (tempGroupUserList == NULL){ puts("User is not in group"); break; } remove_user_from_group(tempUser, tempGroup); break;//end delete usertogroup case 5 : //delete perm if (strcmp(arg[3],"") == 0){ puts("User or group name required"); break; } if (strcmp(arg[2],"") == 0){ puts("file name required"); break; } tempNode = find_node_by_name(arg[2],workingData->workingDir->directoryHeadNode); if (tempNode == NULL){ puts("No such file"); break; } tempPerms = find_perm_by_name(arg[3],tempNode,workingData); if (tempPerms != NULL){ delete_perms(tempNode, tempPerms); } else { puts("No such user permission on file"); } break;//end delete perm case 6 : //delete filebytes [file] [numbytes] if (strcmp(arg[2],"") == 0){ puts("Filename required"); break; } size = strict_atoi(arg[3]); if (size == 0){ puts("zero bytes deleted"); break; } //validate file tempNode = find_file_node_by_name(arg[2],workingData->workingDir); tempFile = tempNode->file; if (tempNode == NULL){ puts("No such file"); printf("@s\n",arg[2]); break; } tempNum = get_file_size(tempFile); if (size > tempNum){ puts("Too many bytes"); } //tempNum is new file size tempNum = tempNum - size; delete_file_bytes(tempFile, tempNum); break;//end delete file case 7 : //delete help print_help(deleteList, (sizeof(deleteList)/4)); break;//end delete help default: print_help(deleteList, (sizeof(deleteList)/4)); //break;//end delete help } break;//end delete case 4 ://cgc_exit puts("exiting"); goto cgc_exit; break; case 5 ://help print_help(commandList, (sizeof(commandList)/4)); break; case 6 ://ls print_working_dir(workingData); break; case 7 ://cat if (strcmp(arg[1],"") == 0){ puts("Filename required"); break; } tempFile = find_file_by_name(arg[1], workingData->workingDir); if ( tempFile != NULL ){ tempFileChunk = tempFile->head; puts("-----Begin File-----");//five - while ( tempFileChunk != NULL ){ if (tempFileChunk->chunkSize != cgc_write(tempFileChunk,tempFileChunk->chunkSize)){ puts("file write failed"); } /* c = tempFileChunk->chunk; for ( i = 0; i < tempFileChunk->chunkSize; i++ ){//putc each byte of every chunk putc( *c); c++; } */ tempFileChunk = tempFileChunk->next; } puts("-----END File-----");//five - } break; case 8 ://cd if (strcmp(arg[1],"") == 0){ puts("directory required"); break; } if (strcmp(arg[1],"..") == 0){ if (workingData->workingDir->parent != NULL){ workingData->workingDir = workingData->workingDir->parent; } break; } tempNode = find_directory_by_name(arg[1],workingData->workingDir); if ( tempNode != NULL ){ workingData->workingDir = tempNode; break; } puts("No such directory in working directory"); break;//end cd default : printf("Invalid command @s\n",arg[0]); print_help(commandList, (sizeof(commandList)/4)); } } cgc_exit: return; }