X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/274986f21a7bdfbc18117e41d93c67833996e5f1..3c09f7a6f51bde3bb53d991691aab8879edbf36b:/uip/post.c diff --git a/uip/post.c b/uip/post.c index 4cdc28f7..0a42ad2f 100644 --- a/uip/post.c +++ b/uip/post.c @@ -1,4 +1,3 @@ - /* * post.c -- enter messages into the mail transport system * @@ -84,7 +83,6 @@ X("partno", -6, PARTSW) \ X("sasl", SASLminc(4), SASLSW) \ X("nosasl", SASLminc(6), NOSASLSW) \ - X("saslmaxssf", SASLminc(10), SASLMXSSFSW) \ X("saslmech", SASLminc(5), SASLMECHSW) \ X("user", SASLminc(-4), USERSW) \ X("port server submission port name/number", 4, PORTSW) \ @@ -123,15 +121,16 @@ DEFINE_SWITCH_ARRAY(POST, switches); static struct oauth_profile { const char *profname; int switchnum; + const char *value; } oauthswitches[] = { - { "oauth-%s-credential-file", OAUTHCREDFILESW }, - { "oauth-%s-client_id", OAUTHCLIDSW }, - { "oauth-%s-client_secret", OAUTHCLSECSW }, - { "oauth-%s-auth_endpoint", OAUTHAUTHENDSW }, - { "oauth-%s-redirect_uri", OAUTHREDIRSW }, - { "oauth-%s-token_endpoint", OAUTHTOKENDSW }, - { "oauth-%s-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 { @@ -231,7 +230,6 @@ static int checksw = 0; /* whom -check */ static int linepos=0; /* putadr()'s position on the line */ static int nameoutput=0; /* putadr() has output header name */ static int sasl=0; /* Use SASL auth for SMTP */ -static int saslssf=-1; /* Our maximum SSF for SASL */ static char *saslmech=NULL; /* Force use of particular SASL mech */ static char *user=NULL; /* Authenticate as this user */ static char *port="submission"; /* Name of server port for SMTP submission */ @@ -290,7 +288,7 @@ 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); @@ -309,13 +307,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], *auth_svc = "post"; + 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; @@ -462,12 +460,6 @@ main (int argc, char **argv) sasl = 0; continue; - case SASLMXSSFSW: - if (!(cp = *argp++) || *cp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - saslssf = atoi(cp); - continue; - case SASLMECHSW: if (!(saslmech = *argp++) || *saslmech == '-') adios (NULL, "missing argument to %s", argp[-2]); @@ -476,6 +468,7 @@ main (int argc, char **argv) case AUTHSERVICESW: if (!(auth_svc = *argp++) || *auth_svc == '-') adios (NULL, "missing argument to %s", argp[-2]); + oauth_flag++; continue; case OAUTHCREDFILESW: @@ -487,17 +480,13 @@ main (int argc, char **argv) case OAUTHSCOPESW: { int i; - char sbuf[128]; if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); for (i = 0; oauthswitches[i].profname != NULL; i++) { if (oauthswitches[i].switchnum == swnum) { - snprintf(sbuf, sizeof(sbuf), - oauthswitches[i].profname, auth_svc); - sbuf[sizeof(sbuf) - 1] = '\0'; - add_profile_entry(sbuf, cp); + oauthswitches[i].value = cp; break; } } @@ -507,7 +496,6 @@ main (int argc, char **argv) "to profile entry", argp[-2]); oauth_flag++; - continue; } @@ -695,10 +683,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); } @@ -710,7 +723,7 @@ 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, auth_svc); } @@ -1614,8 +1627,7 @@ post (char *file, int bccque, int talk, char *envelope, int oauth_flag, } } else { if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch, - verbose, snoop, sasl, saslssf, - saslmech, user, + verbose, snoop, sasl, saslmech, user, oauth_flag ? auth_svc : NULL, tls)) || rp_isbad (retval = sm_winit (envelope))) die (NULL, "problem initializing server; %s", rp_string (retval)); @@ -1646,7 +1658,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; @@ -1655,9 +1667,8 @@ verify_all_addresses (int talk, char *envelope, int oauth_flag) if (!whomsw || checksw) if (rp_isbad (retval = sm_init (clientsw, serversw, port, watch, - verbose, snoop, sasl, saslssf, - saslmech, user, - oauth_flag ? "post" : NULL, tls)) + verbose, snoop, sasl, saslmech, user, + oauth_flag ? auth_svc : NULL, tls)) || rp_isbad (retval = sm_winit (envelope))) die (NULL, "problem initializing server; %s", rp_string (retval));