diff --git a/doc/config.html b/doc/config.html index 51c6ff9a..b7bc6383 100755 --- a/doc/config.html +++ b/doc/config.html @@ -1134,7 +1134,14 @@ Options Location = Main Building{a}, New Building{b}, Old Building{c} It is possible to specify an OR of several conditions like in the case {b,c}. This is also possible over several conditions, like {1,a} would mean -"The PC has Linux or is in the Main Building". +"The PC has Linux or is in the Main Building". To specify a AND between +conditions, a "&" is used. The condition +

+

+ +specifies for example the condition "Linux AND Main Building".


  Access control  
diff --git a/src/elogd.c b/src/elogd.c index 1679a29b..4843fefc 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.293 2004/03/13 21:07:58 midas + Implemented and between conditions + Revision 1.292 2004/03/13 15:00:05 midas Implemented OR's of several conditions @@ -760,7 +763,7 @@ void show_error(char *error); BOOL enum_user_line(LOGBOOK * lbs, int n, char *user); int get_user_line(char *logbook_name, char *user, char *password, char *full_name, char *email, char *email_notify); -int strbreak(char *str, char list[][NAME_LENGTH], int size); +int strbreak(char *str, char list[][NAME_LENGTH], int size, char *brk); int execute_shell(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH], char *sh_cmd); BOOL isparam(char *param); @@ -1507,7 +1510,7 @@ INT sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, logf(lbs, str); /* break recipients into list */ - n = strbreak(to, list, 1024); + n = strbreak(to, list, 1024, ","); for (i = 0; i < n; i++) { snprintf(str, strsize - 1, "RCPT TO: <%s>\r\n", list[i]); @@ -1996,8 +1999,9 @@ void set_condition(char *c) BOOL match_param(char *str, char *param) { - int ncl, npl, i, j; - char *p, pcond[256], clist[10][NAME_LENGTH], plist[10][NAME_LENGTH]; + int ncl, npl, nand, i, j, k; + char *p, pcond[256], clist[10][NAME_LENGTH], plist[10][NAME_LENGTH], + alist[10][NAME_LENGTH]; if (!_condition[0] || str[0] != '{') return strieq(str, param); @@ -2014,8 +2018,8 @@ BOOL match_param(char *str, char *param) if (strchr(pcond, '{')) *strchr(pcond, '{') = ' '; - npl = strbreak(pcond, plist, 10); - ncl = strbreak(_condition, clist, 10); + npl = strbreak(pcond, plist, 10, ","); + ncl = strbreak(_condition, clist, 10, ","); for (i=0 ; in_attr, text, &size, in_reply_to, reply_to, att_file, encoding, locked_by); - n1 = strbreak(reply_to, list1, MAX_N_ATTR); + n1 = strbreak(reply_to, list1, MAX_N_ATTR, ","); reply_to[0] = 0; for (i1 = 0; i1 < n1; i1++) { /* replace old ID by new ID */ @@ -4197,13 +4218,13 @@ This routine corrects that. */ reply_to, att_file, encoding, locked_by); /* go through reply_to list */ - n = strbreak(reply_to, list, MAX_N_ATTR); + n = strbreak(reply_to, list, MAX_N_ATTR, ","); for (i = 0; i < n; i++) { size = sizeof(text); el_retrieve(lbs, atoi(list[i]), date, attr_list, attrib, lbs->n_attr, text, &size, in_reply_to, reply_to, att_file, encoding, locked_by); - n1 = strbreak(in_reply_to, list1, MAX_N_ATTR); + n1 = strbreak(in_reply_to, list1, MAX_N_ATTR, ","); in_reply_to[0] = 0; for (i1 = 0; i1 < n1; i1++) { /* replace old ID by new ID */ @@ -4255,7 +4276,7 @@ int el_move_message_thread(LOGBOOK * lbs, int message_id) /* move all replies recursively */ if (getcfg(lbs->name, "Resubmit replies", str) && atoi(str) == 1) { if (reply_to[0]) { - n = strbreak(reply_to, list, MAX_N_ATTR); + n = strbreak(reply_to, list, MAX_N_ATTR, ","); for (i = 0; i < n; i++) el_move_message_thread(lbs, atoi(list[i])); } @@ -4934,11 +4955,11 @@ void redirect(LOGBOOK * lbs, char *rel_path) /*------------------------------------------------------------------*/ -int strbreak(char *str, char list[][NAME_LENGTH], int size) +int strbreak(char *str, char list[][NAME_LENGTH], int size, char *brk) /* break comma-separated list into char array, stripping leading and trailing blanks */ { - int i; + int i, j; char *p; memset(list, 0, size * NAME_LENGTH); @@ -4959,16 +4980,17 @@ and trailing blanks */ *strchr(list[i], '"') = 0; p += strlen(list[i]) + 1; - while (*p == ' ' || *p == ',') + while (*p == ' ' || strchr(brk, *p)) p++; } else { strlcpy(list[i], p, NAME_LENGTH); - if (strchr(list[i], ',')) - *strchr(list[i], ',') = 0; + for (j=0 ; j<(int)strlen(list[i]) ; j++) + if (strchr(brk, list[i][j])) + list[i][j] = 0; p += strlen(list[i]); - while (*p == ' ' || *p == ',') + while (*p == ' ' || (*p && strchr(brk, *p))) p++; } @@ -5001,37 +5023,37 @@ and attr_flags arrays */ /* get attribute list */ memset(attr_list, 0, sizeof(attr_list)); - n = strbreak(list, attr_list, MAX_N_ATTR); + n = strbreak(list, attr_list, MAX_N_ATTR, ","); /* get options lists for attributes */ memset(attr_options, 0, sizeof(attr_options)); for (i = 0; i < n; i++) { sprintf(str, "Options %s", attr_list[i]); if (getcfg(logbook, str, list)) - strbreak(list, attr_options[i], MAX_N_LIST); + strbreak(list, attr_options[i], MAX_N_LIST, ","); sprintf(str, "MOptions %s", attr_list[i]); if (getcfg(logbook, str, list)) { - strbreak(list, attr_options[i], MAX_N_LIST); + strbreak(list, attr_options[i], MAX_N_LIST, ","); attr_flags[i] |= AF_MULTI; } sprintf(str, "ROptions %s", attr_list[i]); if (getcfg(logbook, str, list)) { - strbreak(list, attr_options[i], MAX_N_LIST); + strbreak(list, attr_options[i], MAX_N_LIST, ","); attr_flags[i] |= AF_RADIO; } sprintf(str, "IOptions %s", attr_list[i]); if (getcfg(logbook, str, list)) { - strbreak(list, attr_options[i], MAX_N_LIST); + strbreak(list, attr_options[i], MAX_N_LIST, ","); attr_flags[i] |= AF_ICON; } } /* check if attribute required */ getcfg(logbook, "Required Attributes", list); - m = strbreak(list, tmp_list, MAX_N_ATTR); + m = strbreak(list, tmp_list, MAX_N_ATTR, ","); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (strieq(attr_list[j], tmp_list[i])) @@ -5040,7 +5062,7 @@ and attr_flags arrays */ /* check if locked attribute */ getcfg(logbook, "Locked Attributes", list); - m = strbreak(list, tmp_list, MAX_N_ATTR); + m = strbreak(list, tmp_list, MAX_N_ATTR, ","); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (strieq(attr_list[j], tmp_list[i])) @@ -5049,7 +5071,7 @@ and attr_flags arrays */ /* check if fixed attribute for Edit */ getcfg(logbook, "Fixed Attributes Edit", list); - m = strbreak(list, tmp_list, MAX_N_ATTR); + m = strbreak(list, tmp_list, MAX_N_ATTR, ","); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (strieq(attr_list[j], tmp_list[i])) @@ -5058,7 +5080,7 @@ and attr_flags arrays */ /* check if fixed attribute for Reply */ getcfg(logbook, "Fixed Attributes Reply", list); - m = strbreak(list, tmp_list, MAX_N_ATTR); + m = strbreak(list, tmp_list, MAX_N_ATTR, ","); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (strieq(attr_list[j], tmp_list[i])) @@ -5067,7 +5089,7 @@ and attr_flags arrays */ /* check for extendable options */ getcfg(logbook, "Extendable Options", list); - m = strbreak(list, tmp_list, MAX_N_ATTR); + m = strbreak(list, tmp_list, MAX_N_ATTR, ","); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) if (strieq(attr_list[j], tmp_list[i])) @@ -5280,7 +5302,7 @@ LBLIST get_logbook_hierarchy(void) else strlcpy(root->member[n]->name, grpname + 10, 256); - m = strbreak(grpmembers, grplist, MAX_N_LIST); + m = strbreak(grpmembers, grplist, MAX_N_LIST, ","); root->member[n]->n_members = m; root->member[n]->member = calloc(sizeof(void *), m); @@ -6453,7 +6475,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL /* remove attributes for replies */ if (breply) { getcfg(lbs->name, "Remove on reply", str); - n = strbreak(str, list, MAX_N_ATTR); + n = strbreak(str, list, MAX_N_ATTR, ","); for (i = 0; i < n; i++) for (j = 0; j < lbs->n_attr; j++) { if (strieq(attr_list[j], list[i])) @@ -6679,7 +6701,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL sprintf(str, "Format %s", attr_list[index]); if (getcfg(lbs->name, str, format)) { - n = strbreak(format, fl, 8); + n = strbreak(format, fl, 8, ","); if (n > 0) format_flags = atoi(fl[0]); if (n > 1) @@ -9774,7 +9796,7 @@ void synchronize_logbook(LOGBOOK * lbs, BOOL bcron) return; } - nserver = strbreak(str, list, MAX_N_LIST); + nserver = strbreak(str, list, MAX_N_LIST, ","); for (index = 0; index < nserver; index++) { @@ -10995,7 +11017,7 @@ BOOL is_user_allowed(LOGBOOK * lbs, char *command) sprintf(str, "Deny %s", command); if (getcfg(lbs->name, str, users)) { /* check if current user in list */ - n = strbreak(users, list, MAX_N_LIST); + n = strbreak(users, list, MAX_N_LIST, ","); for (i = 0; i < n; i++) if (strieq(list[i], getparam("unm"))) break; @@ -11020,7 +11042,7 @@ BOOL is_user_allowed(LOGBOOK * lbs, char *command) return TRUE; /* check if current user in list */ - n = strbreak(users, list, MAX_N_LIST); + n = strbreak(users, list, MAX_N_LIST, ","); for (i = 0; i < n; i++) if (strieq(list[i], getparam("unm"))) return TRUE; @@ -11087,7 +11109,7 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) strcat(menu_str, "Help, "); } else { /* check for admin command */ - n = strbreak(menu_str, menu_item, MAX_N_LIST); + n = strbreak(menu_str, menu_item, MAX_N_LIST, ","); menu_str[0] = 0; admin_user[0] = 0; getcfg(lbs->name, "Admin user", admin_user); @@ -11164,13 +11186,13 @@ BOOL is_command_allowed(LOGBOOK * lbs, char *command) } /* check if command is present in the menu list */ else if (command[0]) { - n = strbreak(menu_str, menu_item, MAX_N_LIST); + n = strbreak(menu_str, menu_item, MAX_N_LIST, ","); for (i = 0; i < n; i++) if (strieq(command, menu_item[i]) || strieq(command, loc(menu_item[i]))) break; if (i == n) { - n = strbreak(other_str, menu_item, MAX_N_LIST); + n = strbreak(other_str, menu_item, MAX_N_LIST, ","); for (i = 0; i < n; i++) if (strieq(command, loc(menu_item[i]))) break; @@ -11282,7 +11304,7 @@ void show_page_filters(LOGBOOK * lbs, int n_msg, int page_n, BOOL mode_commands, if (getcfg(lbs->name, "Quick filter", str)) { rsprintf("\n"); - n = strbreak(str, list, MAX_N_LIST); + n = strbreak(str, list, MAX_N_LIST, ","); for (index = 0; index < n; index++) { if (strieq(list[index], loc("Date"))) { @@ -11517,7 +11539,7 @@ void show_select_navigation(LOGBOOK * lbs) rsprintf("\n"); if (getcfg(lbs->name, "Move to", str)) { - n_log = strbreak(str, lbk_list, MAX_N_LIST); + n_log = strbreak(str, lbk_list, MAX_N_LIST, ","); for (i = 0; i < n_log; i++) rsprintf("