📄 htgroup.c
字号:
/* MODULE HTGroup.c** GROUP FILE ROUTINES**** Contains group file parser and routines to match IP** address templates and to find out group membership.****** AUTHORS:** AL Ari Luotonen luotonen@dxcern.cern.ch**** HISTORY:****** BUGS:******** GROUP DEFINITION GRAMMAR:**** string = "sequence of alphanumeric characters"** user_name ::= string** group_name ::= string** group_ref ::= group_name** user_def ::= user_name | group_ref** user_def_list ::= user_def { ',' user_def }** user_part = user_def | '(' user_def_list ')'**** templ = "sequence of alphanumeric characters and '*'s"** ip_number_mask ::= templ '.' templ '.' templ '.' templ** domain_name_mask ::= templ { '.' templ }** address ::= ip_number_mask | domain_name_mask** address_def ::= address** address_def_list ::= address_def { ',' address_def }** address_part = address_def | '(' address_def_list ')'**** item ::= [user_part] ['@' address_part]** item_list ::= item { ',' item }** group_def ::= item_list** group_decl ::= group_name ':' group_def***/#include <HTUtils.h>#include <HTAAUtil.h>#include <HTLex.h> /* Lexical analysor */#include <HTGroup.h> /* Implemented here */#include <LYUtils.h>#include <LYLeaks.h>/*** Group file parser*/typedef HTList UserDefList;typedef HTList AddressDefList;typedef struct { UserDefList * user_def_list; AddressDefList * address_def_list;} Item;typedef struct { char * name; GroupDef * translation;} Ref;PRIVATE void syntax_error ARGS3(FILE *, fp, char *, msg, LexItem, lex_item){ char buffer[41]; int cnt = 0; int ch; while ((ch = getc(fp)) != EOF && ch != '\n') if (cnt < 40) buffer[cnt++] = (char) ch; buffer[cnt] = (char)0; CTRACE((tfp, "%s %d before: '%s'\nHTGroup.c: %s (got %s)\n", "HTGroup.c: Syntax error in rule file at line", HTlex_line, buffer, msg, lex_verbose(lex_item))); HTlex_line++;}PRIVATE AddressDefList *parse_address_part ARGS1(FILE *, fp){ AddressDefList *address_def_list = NULL; LexItem lex_item; BOOL only_one = NO; lex_item = lex(fp); if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR) only_one = YES; else if (lex_item != LEX_OPEN_PAREN || ((lex_item = lex(fp)) != LEX_ALPH_STR && lex_item != LEX_TMPL_STR)) { syntax_error(fp, "Expecting a single address or '(' beginning list", lex_item); return NULL; } address_def_list = HTList_new(); for(;;) { Ref *ref = typecalloc(Ref); if (ref == NULL) outofmem(__FILE__, "parse_address_part"); ref->name = NULL; ref->translation = NULL; StrAllocCopy(ref->name, HTlex_buffer); HTList_addObject(address_def_list, (void*)ref); if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP) break; /* ** Here lex_item == LEX_ITEM_SEP; after item separator it ** is ok to have one or more newlines (LEX_REC_SEP) and ** they are ignored (continuation line). */ do { lex_item = lex(fp); } while (lex_item == LEX_REC_SEP); if (lex_item != LEX_ALPH_STR && lex_item != LEX_TMPL_STR) { syntax_error(fp, "Expecting an address template", lex_item); HTList_delete(address_def_list); address_def_list = NULL; return NULL; } } if (!only_one && lex_item != LEX_CLOSE_PAREN) { HTList_delete(address_def_list); address_def_list = NULL; syntax_error(fp, "Expecting ')' closing address list", lex_item); return NULL; } return address_def_list;}PRIVATE UserDefList *parse_user_part ARGS1(FILE *, fp){ UserDefList *user_def_list = NULL; LexItem lex_item; BOOL only_one = NO; lex_item = lex(fp); if (lex_item == LEX_ALPH_STR) only_one = YES; else if (lex_item != LEX_OPEN_PAREN || (lex_item = lex(fp)) != LEX_ALPH_STR) { syntax_error(fp, "Expecting a single name or '(' beginning list", lex_item); return NULL; } user_def_list = HTList_new(); for (;;) { Ref *ref = typecalloc(Ref); if (ref == NULL) outofmem(__FILE__, "parse_user_part"); ref->name = NULL; ref->translation = NULL; StrAllocCopy(ref->name, HTlex_buffer); HTList_addObject(user_def_list, (void*)ref); if (only_one || (lex_item = lex(fp)) != LEX_ITEM_SEP) break; /* ** Here lex_item == LEX_ITEM_SEP; after item separator it ** is ok to have one or more newlines (LEX_REC_SEP) and ** they are ignored (continuation line). */ do { lex_item = lex(fp); } while (lex_item == LEX_REC_SEP); if (lex_item != LEX_ALPH_STR) { syntax_error(fp, "Expecting user or group name", lex_item); HTList_delete(user_def_list); user_def_list = NULL; return NULL; } } if (!only_one && lex_item != LEX_CLOSE_PAREN) { HTList_delete(user_def_list); user_def_list = NULL; syntax_error(fp, "Expecting ')' closing user/group list", lex_item); return NULL; } return user_def_list;}PRIVATE Item *parse_item ARGS1(FILE *, fp){ Item *item = NULL; UserDefList *user_def_list = NULL; AddressDefList *address_def_list = NULL; LexItem lex_item; lex_item = lex(fp); if (lex_item == LEX_ALPH_STR || lex_item == LEX_OPEN_PAREN) { unlex(lex_item); user_def_list = parse_user_part(fp); lex_item = lex(fp); } if (lex_item == LEX_AT_SIGN) { lex_item = lex(fp); if (lex_item == LEX_ALPH_STR || lex_item == LEX_TMPL_STR || lex_item == LEX_OPEN_PAREN) { unlex(lex_item); address_def_list = parse_address_part(fp); } else { if (user_def_list) { HTList_delete(user_def_list); /* @@@@ */ user_def_list = NULL; } syntax_error(fp, "Expected address part (single address or list)", lex_item); return NULL; } } else unlex(lex_item); if (!user_def_list && !address_def_list) { syntax_error(fp, "Empty item not allowed", lex_item); return NULL; } item = typecalloc(Item); if (item == NULL) outofmem(__FILE__, "parse_item"); item->user_def_list = user_def_list; item->address_def_list = address_def_list; return item;}PRIVATE ItemList *parse_item_list ARGS1(FILE *, fp){ ItemList *item_list = HTList_new(); Item *item; LexItem lex_item; for(;;) { if (!(item = parse_item(fp))) { HTList_delete(item_list); /* @@@@ */ item_list = NULL; return NULL; } HTList_addObject(item_list, (void*)item); lex_item = lex(fp); if (lex_item != LEX_ITEM_SEP) { unlex(lex_item); return item_list; } /* ** Here lex_item == LEX_ITEM_SEP; after item separator it ** is ok to have one or more newlines (LEX_REC_SEP) and ** they are ignored (continuation line). */ do { lex_item = lex(fp); } while (lex_item == LEX_REC_SEP); unlex(lex_item); }}PUBLIC GroupDef *HTAA_parseGroupDef ARGS1(FILE *, fp){ ItemList *item_list = NULL; GroupDef *group_def = NULL; LexItem lex_item; if (!(item_list = parse_item_list(fp))) { return NULL; } group_def = typecalloc(GroupDef); if (group_def == NULL) outofmem(__FILE__, "HTAA_parseGroupDef"); group_def->group_name = NULL; group_def->item_list = item_list; if ((lex_item = lex(fp)) != LEX_REC_SEP) { syntax_error(fp, "Garbage after group definition", lex_item); } return group_def;}PRIVATE GroupDef *parse_group_decl ARGS1(FILE *, fp){ char *group_name = NULL; GroupDef *group_def = NULL; LexItem lex_item; do { lex_item = lex(fp); } while (lex_item == LEX_REC_SEP); /* Ignore empty lines */ if (lex_item != LEX_ALPH_STR) { if (lex_item != LEX_EOF) syntax_error(fp, "Expecting group name", lex_item); return NULL; } StrAllocCopy(group_name, HTlex_buffer); if (LEX_FIELD_SEP != (lex_item = lex(fp))) { syntax_error(fp, "Expecting field separator", lex_item); FREE(group_name); return NULL; } if (!(group_def = HTAA_parseGroupDef(fp))) { FREE(group_name); return NULL; } group_def->group_name = group_name; return group_def;}/*** Group manipulation routines*/PRIVATE GroupDef *find_group_def ARGS2(GroupDefList *, group_list, CONST char *, group_name){ if (group_list && group_name) { GroupDefList *cur = group_list; GroupDef *group_def; while (NULL != (group_def = (GroupDef*)HTList_nextObject(cur))) { if (!strcmp(group_name, group_def->group_name)) { return group_def; } } } return NULL;}PUBLIC void HTAA_resolveGroupReferences ARGS2(GroupDef *, group_def, GroupDefList *, group_def_list){ if (group_def && group_def->item_list && group_def_list) { ItemList *cur1 = group_def->item_list; Item *item; while (NULL != (item = (Item*)HTList_nextObject(cur1))) { UserDefList *cur2 = item->user_def_list; Ref *ref; while (NULL != (ref = (Ref*)HTList_nextObject(cur2))) ref->translation = find_group_def(group_def_list, ref->name); /* Does NOT translate address_def_list */ } }}PRIVATE void add_group_def ARGS2(GroupDefList *, group_def_list, GroupDef *, group_def){ HTAA_resolveGroupReferences(group_def, group_def_list); HTList_addObject(group_def_list, (void*)group_def);}PRIVATE GroupDefList *parse_group_file ARGS1(FILE *, fp){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -