static void ann_write_bmlog(char *path) { char *ptr, board[STRLEN]; if ((ptr = strstr(path, "groups/")) != NULL) ann_get_board(ptr, board, sizeof(board)); if (board[0] != '\0') bmlog(getCurrentUser()->userid, board, 13, 1); }
/* 返回值意义: -1 没有权限 0 有看的权限 1 有管理的权限 */ int ann_traverse_check(char *path, struct userec *user) { char *ptr; char *ptr2; size_t i = 0; char filename[256]; char buf[256], *fnameptr; char pathbuf[256]; char currpath[256]; char title[STRLEN]; FILE *fp; char board[STRLEN]; bool has_perm_boards = false, sysop_only = false; char *bmstr; int bms_level = 0; /* path parameter can not have leading '/' character */ if (path[0] == '/') return -1; board[0] = '\0'; if ((ptr = strstr(path, "groups/")) != NULL) ann_get_board(ptr, board, sizeof(board)); bzero(pathbuf, sizeof(pathbuf)); if (board[0] == '\0') { ptr = path; } else { const struct boardheader *bh; bh = getbcache(board); if (check_read_perm(user, bh) == 0) return -1; ann_get_path(board, filename, sizeof(filename)); snprintf(pathbuf, sizeof(pathbuf), "0Announce%s", filename); ptr = path + strlen(pathbuf); i = strlen(pathbuf); /* 如果是本版版主 则获得版主权限 TODO */ if (chk_currBM(bh->BM, user)) has_perm_boards = true; } /* 如果是站务 则获得版主权限 */ if (HAS_PERM(user, PERM_OBOARDS) || HAS_PERM(user, PERM_ANNOUNCE) || HAS_PERM(user, PERM_SYSOP)) has_perm_boards = true; /* 开始逐级判断权限 */ while (*ptr != '\0') { if (*ptr == '/') { snprintf(filename, sizeof(filename), "%s/.Names", pathbuf); } else { if (i < sizeof(pathbuf)) pathbuf[i] = *ptr; ptr++; i++; continue; } if ((fp = fopen(filename, "r")) == NULL) return -1; while (fgets(buf, sizeof(buf), fp) != NULL) { if ((ptr2 = strrchr(buf, '\n')) != NULL) *ptr2 = '\0'; if (strncmp(buf, "Name=", 5) == 0) { strncpy(title, buf + 5, sizeof(title) - 1); title[sizeof(title) - 1] = '\0'; continue; } if (strncmp(buf, "Path=~/", 7) == 0) fnameptr = buf + 7; else if (strncmp(buf, "Path=", 5) == 0) fnameptr = buf + 5; else continue; snprintf(currpath, sizeof(currpath), "%s/%s", pathbuf, fnameptr); if (strncmp(currpath, path, strlen(currpath)) != 0) continue; if (path[strlen(currpath)] != '/' && path[strlen(currpath)]!='\0' ) continue; /* 如果有指定BM 则按BM名单获得版主权限 */ bmstr = strstr(title, "(BM:"); if (bmstr != NULL) if (chk_currBM(bmstr + 4, user)) has_perm_boards = true; /* 如果指定BMS 则目录的版主权限级别升高 */ if (strstr(title, "(BM: BMS)")) bms_level++; /* 如果指定SYSOPS 则目录为仅站务可见 */ if (strstr(title, "(BM: SYSOPS)")) sysop_only = true; #ifdef ANN_CTRLK /* 如果Ctrl+K权限验证不通过 则禁止 */ if(!canread(has_perm_boards ? PERM_BOARDS : 0, pathbuf, fnameptr, title)) { fclose(fp); return -1; } #endif /* 如果在一级BMS目录下且用户不具备版主权限 则禁止 */ if ((bms_level >=1) && !HAS_PERM(user, PERM_BOARDS)) { fclose(fp); return -1; } /* 如果在二级BMS目录下且用户不具备本版版主权限 则禁止 */ if ((bms_level >=2) && !has_perm_boards) { fclose(fp); return -1; } /* 如果在SYSOPS目录下且用户不是站务 则禁止 */ if (sysop_only && !HAS_PERM(user, PERM_SYSOP)) { fclose(fp); return -1; } break; } if (feof(fp)) { fclose(fp); return -1; } fclose(fp); if (i < sizeof(pathbuf)) pathbuf[i] = *ptr; ptr++; i++; } return has_perm_boards ? 1 : 0; }