|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 10864 (0x2a70) Types: TextFile Names: »tb_getauth.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/table/tb_getauth.c«
/* tb_getauth.c: retrieve authorisation information */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/table/RCS/tb_getauth.c,v 5.0 90/09/20 16:15:11 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/table/RCS/tb_getauth.c,v 5.0 90/09/20 16:15:11 pp Exp Locker: pp $ * * $Log: tb_getauth.c,v $ * Revision 5.0 90/09/20 16:15:11 pp * rcsforce : 5.0 public release * */ #include "head.h" #include "util.h" #include "chan.h" #include "auth.h" #include "list_rchan.h" #include "adr.h" #include <isode/cmd_srch.h> /* -- statics -- */ static Table *Chan_auth = NULLTBL; static Table *Mta_auth = NULLTBL; static Table *User_auth = NULLTBL; /* -- command tables -- */ static CMD_TABLE authtbl_chan[] = { "free", AUTH_CHAN_FREE, "negative", AUTH_CHAN_NEGATIVE, "block", AUTH_CHAN_BLOCK, "none", AUTH_CHAN_NONE, "warnsender", AUTH_CHAN_WARNS, "warnrecipient", AUTH_CHAN_WARNR, "sizelimit", AUTH_CHAN_SIZELIMIT, "test", AUTH_CHAN_TEST, 0, -1 }; #define AUTH_MTA_DEFAULT 1 #define AUTH_MTA_REQUIRES 2 #define AUTH_MTA_EXCLUDES 3 #define AUTH_MTA_CONTENTEX 4 #define AUTH_MTA_SIZELIMIT 5 static CMD_TABLE authtbl_mta[] = { "default", AUTH_MTA_DEFAULT, "requires", AUTH_MTA_REQUIRES, "excludes", AUTH_MTA_EXCLUDES, "content-excludes", AUTH_MTA_CONTENTEX, "sizelimit", AUTH_MTA_SIZELIMIT, 0, -1 }; #define AUTH_USER_DEFAULT 1 #define AUTH_USER_CONTENTEX 2 #define AUTH_USER_SIZELIMIT 3 static CMD_TABLE authtbl_user[] = { "default", AUTH_USER_DEFAULT, "content-excludes", AUTH_USER_CONTENTEX, "sizelimit", AUTH_USER_SIZELIMIT, 0, -1 }; CMD_TABLE authtbl_rights[] = { /* NOT static - used in auth.c */ "in", AUTH_RIGHTS_IN, "out", AUTH_RIGHTS_OUT, "both", AUTH_RIGHTS_BOTH, "none", AUTH_RIGHTS_NONE, "unset", AUTH_RIGHTS_UNSET, 0, -1 }; extern CHAN *ch_inbound; /* -- chan calling submit -- */ extern char *chan_auth_tbl; extern char *mta_auth_tbl; extern char *user_auth_tbl; extern char *ad_getlocal(); /* -- local routines */ int tb_getauthchan(); int tb_getauthmta(); int tb_getauthusr(); void tb_parse_authchan(); static LIST_CHAN_RIGHTS *list_chan_rights_new(); static LIST_REGEX *list_regex_new(); static int tb_authrights(); static void add_cont_excludes(); static void add_chanrights(); static void add_regex(); static void list_chan_rights_add(); static void list_regex_add(); static void tb_getauthchan_aux(); static void tb_parse_authmta(); /* --------------------- Begin Routines ------------------------------------ */ int tb_getauthchan (ochan) LIST_AUTH_CHAN *ochan; { char key[FILNSIZE]; ochan -> li_found = FALSE; if (Chan_auth == NULLTBL) if ((Chan_auth = tb_nm2struct (chan_auth_tbl)) == NULLTBL) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_getauthchan missing %s", chan_auth_tbl)); return OK; } (void) sprintf (key, "%s->%s", ch_inbound -> ch_name, ochan -> li_chan -> ch_name); (void) tb_getauthchan_aux (key, ochan); if (ochan -> li_found == TRUE) return OK; (void) sprintf (key, "%s->*", ch_inbound -> ch_name); (void) tb_getauthchan_aux (key, ochan); if (ochan -> li_found == TRUE) return OK; (void) sprintf (key, "*->%s", ochan -> li_chan -> ch_name); (void) tb_getauthchan_aux (key, ochan); return OK; } void tb_parse_authchan (c, argc, argv) LIST_AUTH_CHAN *c; int argc; char **argv; { int i, retval; char *p; for (i = 0; i < argc; i++) if ((p = index (argv[i], '=')) == NULLCP) { PP_DBG (("Lib/tb_parse_authchan %s", argv[i])); switch (retval = cmd_srch (argv[i], authtbl_chan)) { case AUTH_CHAN_FREE: c -> policy = AUTH_CHAN_FREE; break; case AUTH_CHAN_NEGATIVE: c -> policy = AUTH_CHAN_NEGATIVE; break; case AUTH_CHAN_BLOCK: c -> policy = AUTH_CHAN_BLOCK; break; case AUTH_CHAN_NONE: c -> policy = AUTH_CHAN_NONE; break; case AUTH_CHAN_TEST: c -> test = AUTH_CHAN_TEST; break; default: PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_parse_authchan error %d %s", retval, argv[i])); break; } } else { *p++ = '\0'; PP_DBG (("Lib/tb_parse_authchan %s = %s", argv[i], p)); switch (retval = cmd_srch (argv[i], authtbl_chan)) { case AUTH_CHAN_WARNS: c -> warnsender = strdup (p); break; case AUTH_CHAN_WARNR: c -> warnrecipient = strdup (p); break; case AUTH_CHAN_SIZELIMIT: c -> sizelimit = atol (p); break; default: PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_parse_authchan error %d %s %s", retval, argv[i], p)); break; } } } int tb_getauthmta (omta) LIST_AUTH_MTA *omta; { char *argv [MAX_AUTH_ARGS]; char buf[BUFSIZ]; int argc; PP_DBG (("Lib/tb_getauthmta (%s)", omta -> li_mta)); omta -> li_found = FALSE; if (Mta_auth == NULLTBL) if ((Mta_auth = tb_nm2struct (mta_auth_tbl)) == NULLTBL) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_getauthmta missing %s", mta_auth_tbl)); return OK; } if (tb_k2val (Mta_auth, omta -> li_mta, buf) == NOTOK) return OK; if ((argc = sstr2arg (buf, MAX_AUTH_ARGS, argv, " \t,")) == NOTOK) return OK; omta -> li_found = TRUE; (void) tb_parse_authmta (omta, argc, argv); return OK; } int tb_getauthusr (ousr, ad) AUTH_USER *ousr; ADDR *ad; { char *argv [MAX_AUTH_ARGS]; char buf[BUFSIZ]; char *p, *uname; int argc, i, rights, retval = RP_BAD; CHAN *c; ousr -> found = FALSE; if (User_auth == NULLTBL) if ((User_auth = tb_nm2struct (user_auth_tbl)) == NULLTBL) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_getauthusr missing %s", user_auth_tbl)); return OK; } if (ad -> ad_type == AD_X400_TYPE) uname = ad -> ad_r400adr; else uname = ad -> ad_r822adr; PP_DBG (("Lib/tb_getauthusr (%s)", uname)); if (tb_k2val (User_auth, uname, buf) == NOTOK) { char *local; local = ad_getlocal (uname, ad -> ad_type); if (!isstr (local)) return OK; retval = tb_k2val (User_auth, local, buf); free (local); if (retval == NOTOK) return OK; } if ((argc = sstr2arg (buf, MAX_AUTH_ARGS, argv, " \t,")) == NOTOK) return OK; ousr -> found = TRUE; for (i = 0; i < argc; i++) { if ((p = index (argv[i], '=')) == NULLCP) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_getauthusr error %d %s", retval, argv[i])); return; } /* -- all of form xxx=yyy -- */ *p++ = '\0'; PP_DBG (("Lib/tb_getauthusr %s = %s", argv[i], p)); switch (retval = cmd_srch (argv[i], authtbl_user)) { case AUTH_USER_DEFAULT: if ((rights = tb_authrights (p)) != NOTOK) ousr -> rights = rights; break; case AUTH_USER_CONTENTEX: add_cont_excludes (&ousr -> content_excludes, p); break; case AUTH_USER_SIZELIMIT: ousr -> sizelimit = atol (p); break; default: if ((rights = tb_authrights (p)) != NOTOK) if ((c = ch_nm2struct (argv[i])) != NULLCHAN) add_chanrights (&ousr -> li_cr, c, rights); break; } } return OK; } /* --------------------- Static Routines ----------------------------------- */ static void tb_getauthchan_aux (str, ochan) char *str; LIST_AUTH_CHAN *ochan; { int argc; char *argv[MAX_AUTH_ARGS]; char buf[BUFSIZ]; PP_DBG (("Lib/tb_getauthchan_aux: try key %s", str)); if (tb_k2val (Chan_auth, str, buf) == NOTOK) return; if ((argc = sstr2arg (buf, MAX_AUTH_ARGS, argv, " \t,")) == NOTOK) return; ochan -> li_found = TRUE; (void) tb_parse_authchan (ochan, argc, argv); return; } static void tb_parse_authmta (omta, argc, argv) LIST_AUTH_MTA *omta; int argc; char **argv; { int i, retval = NOTOK, rights; char *p; CHAN *c; for (i = 0; i < argc; i++) { if ((p = index (argv[i], '=')) == NULLCP) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/tb_parse_authchan error %d %s", retval, argv[i])); return; } /* -- all of form xxx=yyy -- */ *p++ = '\0'; PP_DBG (("Lib/tb_getauthmta %s = %s", argv[i], p)); switch (retval = cmd_srch (argv[i], authtbl_mta)) { case AUTH_MTA_DEFAULT: if ((rights = tb_authrights (p)) != NOTOK) omta -> rights = rights; break; case AUTH_MTA_REQUIRES: add_regex (&omta -> requires, p); break; case AUTH_MTA_EXCLUDES: add_regex (&omta -> excludes, p); break; case AUTH_MTA_CONTENTEX: add_cont_excludes (&omta -> content_excludes, p); break; case AUTH_MTA_SIZELIMIT: omta -> sizelimit = atol (p); break; default: if ((rights = tb_authrights (p)) != NOTOK) if ((c = ch_nm2struct (argv[i])) != NULLCHAN) add_chanrights (&omta -> li_cr, c, rights); break; } } } static int tb_authrights (cp) char *cp; { int retval; retval = cmd_srch (cp, authtbl_rights); if (retval == NOTOK) PP_LOG (LLOG_NOTICE, ("Lib/tb_authrights not known <%s>", cp)); PP_DBG (("Lib/tb_authrights for %s returns %d", cp, retval)); return retval; } static void add_regex (lp, str) LIST_REGEX **lp; char *str; /* 1 or more regular expressions */ { char *cp; while (str) { cp = str; if (str = index (str, AUTH_SEPERATOR)) *str++ = '\0'; list_regex_add (lp, list_regex_new (cp)); } } static void list_regex_add (list, item) LIST_REGEX **list; LIST_REGEX *item; { LIST_REGEX *lp = *list; if (lp == NULLIST_REGEX) { *list = item; return; } while (lp -> li_next != NULLIST_REGEX) lp = lp -> li_next; lp -> li_next = item; } static LIST_REGEX *list_regex_new (value) char *value; { LIST_REGEX *lp; if (value == NULLCP) return (NULLIST_REGEX); lp = (LIST_REGEX *) malloc (sizeof *lp); bzero ((char *)lp, sizeof *lp); lp -> li_regex = strdup (value); return (lp); } static void add_cont_excludes (lp, str) LIST_BPT **lp; char *str; { char *cp; while (str) { cp = str; if ((str = index (str, AUTH_SEPERATOR))) *str++ = '\0'; list_bpt_add (lp, list_bpt_new (cp)); } } static void add_chanrights (list, chan, rights) LIST_CHAN_RIGHTS **list; CHAN *chan; int rights; { list_chan_rights_add (list, list_chan_rights_new (chan, rights)); } static void list_chan_rights_add (list, item) LIST_CHAN_RIGHTS **list; LIST_CHAN_RIGHTS *item; { LIST_CHAN_RIGHTS *lp = *list; if (lp == NULLIST_CHAN_RIGHTS) { *list = item; return; } while (lp -> li_next != NULLIST_CHAN_RIGHTS) lp = lp -> li_next; lp -> li_next = item; } static LIST_CHAN_RIGHTS *list_chan_rights_new (chan, rights) CHAN *chan; int rights; { LIST_CHAN_RIGHTS *lp; if (chan == NULLCHAN) return (NULLIST_CHAN_RIGHTS); lp = (LIST_CHAN_RIGHTS *) malloc (sizeof *lp); bzero ((char *)lp, sizeof *lp); lp -> li_rights = AUTH_RIGHTS_UNSET; lp -> li_chan = chan; lp -> li_rights = rights; return (lp); }