X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/63fc8244f0ddecdbdacc21ab797acd2f466a2823..edee2ed36533ed9dfc7be7c0d64f0f965d55b9c4:/uip/post.c diff --git a/uip/post.c b/uip/post.c index 43110f36..0fee356b 100644 --- a/uip/post.c +++ b/uip/post.c @@ -1,4 +1,3 @@ - /* * post.c -- enter messages into the mail transport system * @@ -97,13 +96,14 @@ X("mts smtp|sendmail/smtp|sendmail/pipe", 2, MTSSW) \ X("credentials legacy|file:filename", 0, CREDENTIALSSW) \ X("messageid localname|random", 2, MESSAGEIDSW) \ - X("oauthcredfile", OAUTHminc(-7), OAUTHCREDFILESW) \ - X("oauthclientid", OAUTHminc(-12), OAUTHCLIDSW) \ - X("oauthclientsecret", OAUTHminc(-12), OAUTHCLSECSW) \ - X("oauthauthendpoint", OAUTHminc(-6), OAUTHAUTHENDSW) \ - X("oauthredirect", OAUTHminc(-6), OAUTHREDIRSW) \ - X("oauthtokenendpoint", OAUTHminc(-6), OAUTHTOKENDSW) \ - X("oauthscope", OAUTHminc(-6), OAUTHSCOPESW) \ + X("authservice auth-service-name", OAUTHminc(-11), AUTHSERVICESW) \ + X("oauthcredfile credential-file", OAUTHminc(-7), OAUTHCREDFILESW) \ + X("oauthclientid client-id", OAUTHminc(-12), OAUTHCLIDSW) \ + X("oauthclientsecret client-secret", OAUTHminc(-12), OAUTHCLSECSW) \ + X("oauthauthendpoint authentication-endpoint", OAUTHminc(-6), OAUTHAUTHENDSW) \ + X("oauthredirect redirect-uri", OAUTHminc(-6), OAUTHREDIRSW) \ + X("oauthtokenendpoint token-endpoint", OAUTHminc(-6), OAUTHTOKENDSW) \ + X("oauthscope scope", OAUTHminc(-6), OAUTHSCOPESW) \ #define X(sw, minchars, id) id, DEFINE_SWITCH_ENUM(POST); @@ -122,15 +122,16 @@ DEFINE_SWITCH_ARRAY(POST, switches); static struct oauth_profile { const char *profname; int switchnum; + const char *value; } oauthswitches[] = { - { "oauth-post-credential-file", OAUTHCREDFILESW }, - { "oauth-post-client_id", OAUTHCLIDSW }, - { "oauth-post-client_secret", OAUTHCLSECSW }, - { "oauth-post-auth_endpoint", OAUTHAUTHENDSW }, - { "oauth-post-redirect_url", OAUTHREDIRSW }, - { "oauth-post-token_endpoint", OAUTHTOKENDSW }, - { "oauth-post-scope", OAUTHSCOPESW }, - { NULL, 0 } + { "oauth-%s-credential-file", OAUTHCREDFILESW, NULL }, + { "oauth-%s-client_id", OAUTHCLIDSW, NULL }, + { "oauth-%s-client_secret", OAUTHCLSECSW, NULL }, + { "oauth-%s-auth_endpoint", OAUTHAUTHENDSW, NULL }, + { "oauth-%s-redirect_uri", OAUTHREDIRSW, NULL }, + { "oauth-%s-token_endpoint", OAUTHTOKENDSW, NULL }, + { "oauth-%s-scope", OAUTHSCOPESW, NULL }, + { NULL, 0, NULL } }; struct headers { @@ -289,14 +290,14 @@ static void anno (void); static int annoaux (struct mailname *); static void insert_fcc (struct headers *, char *); static void make_bcc_file (int); -static void verify_all_addresses (int, char *, int); +static void verify_all_addresses (int, char *, int, char *); static void chkadr (void); static void sigon (void); static void sigoff (void); static void p_refile (char *); static void fcc (char *, char *); static void die (char *, char *, ...); -static void post (char *, int, int, char *, int); +static void post (char *, int, int, char *, int, char *); static void do_text (char *file, int fd); static void do_an_address (struct mailname *, int); static void do_addresses (int, int); @@ -308,13 +309,13 @@ main (int argc, char **argv) { int state, compnum, dashstuff = 0, swnum, oauth_flag = 0; char *cp, *msg = NULL, **argp, **arguments, *envelope; - char buf[BUFSIZ], name[NAMESZ]; + char buf[BUFSIZ], name[NAMESZ], *auth_svc = NULL; FILE *in, *out; m_getfld_state_t gstate = 0; if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; } - mts_init (invo_name); + mts_init (); arguments = getarguments (invo_name, argc, argv, 0); argp = arguments; @@ -472,6 +473,12 @@ main (int argc, char **argv) adios (NULL, "missing argument to %s", argp[-2]); continue; + case AUTHSERVICESW: + if (!(auth_svc = *argp++) || *auth_svc == '-') + adios (NULL, "missing argument to %s", argp[-2]); + oauth_flag++; + continue; + case OAUTHCREDFILESW: case OAUTHCLIDSW: case OAUTHCLSECSW: @@ -487,7 +494,7 @@ main (int argc, char **argv) for (i = 0; oauthswitches[i].profname != NULL; i++) { if (oauthswitches[i].switchnum == swnum) { - add_profile_entry(oauthswitches[i].profname, cp); + oauthswitches[i].value = cp; break; } } @@ -497,7 +504,6 @@ main (int argc, char **argv) "to profile entry", argp[-2]); oauth_flag++; - continue; } @@ -685,10 +691,35 @@ main (int argc, char **argv) #endif /* ! TLS_SUPPORT */ } + /* + * If we were given any oauth flags, store the appropriate profile + * entries and make sure an authservice was given (we have to do this + * here because we aren't guaranteed the authservice will be given on + * the command line before the other OAuth flags are given). + */ + + if (oauth_flag) { + int i; + char sbuf[128]; + + if (auth_svc == NULL) { + adios(NULL, "No authentication service given with -authservice"); + } + + for (i = 0; oauthswitches[i].profname != NULL; i++) { + if (oauthswitches[i].value != NULL) { + snprintf(sbuf, sizeof(sbuf), + oauthswitches[i].profname, auth_svc); + sbuf[sizeof(sbuf) - 1] = '\0'; + add_profile_entry(sbuf, oauthswitches[i].value); + } + } + } + /* If we are doing a "whom" check */ if (whomsw) { /* This won't work with MTS_SENDMAIL_PIPE. */ - verify_all_addresses (1, envelope, oauth_flag); + verify_all_addresses (1, envelope, oauth_flag, auth_svc); done (0); } @@ -700,14 +731,14 @@ main (int argc, char **argv) verify_all_addresses with MTS_SENDMAIL_PIPE, but that might require running sendmail as root. Note that spost didn't verify addresses. */ - verify_all_addresses (verbose, envelope, oauth_flag); + verify_all_addresses (verbose, envelope, oauth_flag, auth_svc); } - post (tmpfil, 0, verbose, envelope, oauth_flag); + post (tmpfil, 0, verbose, envelope, oauth_flag, auth_svc); } - post (bccfil, 1, verbose, envelope, oauth_flag); + post (bccfil, 1, verbose, envelope, oauth_flag, auth_svc); (void) m_unlink (bccfil); } else { - post (tmpfil, 0, isatty (1), envelope, oauth_flag); + post (tmpfil, 0, isatty (1), envelope, oauth_flag, auth_svc); } p_refile (tmpfil); @@ -1554,7 +1585,8 @@ do_addresses (int bccque, int talk) */ static void -post (char *file, int bccque, int talk, char *envelope, int oauth_flag) +post (char *file, int bccque, int talk, char *envelope, int oauth_flag, + char *auth_svc) { int fd; int retval, i; @@ -1605,7 +1637,7 @@ post (char *file, int bccque, int talk, char *envelope, int oauth_flag) if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch, verbose, snoop, sasl, saslssf, saslmech, user, - oauth_flag ? "post" : NULL, tls)) + oauth_flag ? auth_svc : NULL, tls)) || rp_isbad (retval = sm_winit (envelope))) die (NULL, "problem initializing server; %s", rp_string (retval)); @@ -1635,7 +1667,7 @@ post (char *file, int bccque, int talk, char *envelope, int oauth_flag) /* Address Verification */ static void -verify_all_addresses (int talk, char *envelope, int oauth_flag) +verify_all_addresses (int talk, char *envelope, int oauth_flag, char *auth_svc) { int retval; struct mailname *lp; @@ -1646,7 +1678,7 @@ verify_all_addresses (int talk, char *envelope, int oauth_flag) if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch, verbose, snoop, sasl, saslssf, saslmech, user, - oauth_flag ? "post" : NULL, tls)) + oauth_flag ? auth_svc : NULL, tls)) || rp_isbad (retval = sm_winit (envelope))) die (NULL, "problem initializing server; %s", rp_string (retval));