-/*
+/* oauth_prof.c -- OAuth 2.0 implementation for XOAUTH2 in SMTP and POP3.
+ *
* This code is Copyright (c) 2014, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
#include <h/oauth.h>
#include <h/utils.h>
+#include "m_maildir.h"
static const struct mh_oauth_service_info SERVICES[] = {
/* https://developers.google.com/accounts/docs/OAuth2InstalledApp */
}
/* Update all service_info fields that are overridden in profile. */
-static boolean
+static bool
update_svc(mh_oauth_service_info *svc, const char *svc_name, char *errbuf,
size_t errbuflen)
{
if (svc->name == NULL) { \
snprintf(errbuf, errbuflen, "%s", #name " is missing"); \
errbuf[errbuflen - 1] = '\0'; \
- return FALSE; \
+ return false; \
}
update(scope);
update(client_id);
svc->display_name = svc->name;
}
- return TRUE;
+ return true;
}
-boolean
+bool
mh_oauth_get_service_info(const char *svc_name, mh_oauth_service_info *svcinfo,
char *errbuf, size_t errbuflen)
{
svcinfo->client_secret = svcinfo->auth_endpoint = NULL;
svcinfo->token_endpoint = svcinfo->redirect_uri = NULL;
- for (i = 0; i < (int) (sizeof SERVICES / sizeof SERVICES[0]); i++) {
+ for (i = 0; i < (int)DIM(SERVICES); i++) {
if (strcmp(SERVICES[i].name, svc_name) == 0) {
copy_svc(svcinfo, &SERVICES[i]);
break;
}
}
- if (!update_svc(svcinfo, svc_name, errbuf, errbuflen)) {
- return FALSE;
- }
-
- return TRUE;
+ return update_svc(svcinfo, svc_name, errbuf, errbuflen);
}
-const char *
+/* Return value must be free(3)'d. */
+char *
mh_oauth_cred_fn(const char *svc)
{
- char *result, *result_if_allocated;
-
- char *component = mh_oauth_node_name_for_svc("credential-file", svc);
- result = context_find(component);
- free(component);
-
- if (result == NULL) {
- result = mh_xmalloc(sizeof "oauth-" - 1
- + strlen(svc)
- + 1 /* '\0' */);
- sprintf(result, "oauth-%s", svc);
- result_if_allocated = result;
- } else {
- result_if_allocated = NULL;
- }
-
- if (result[0] != '/') {
- const char *tmp = m_maildir(result);
- free(result_if_allocated);
- result = getcpy(tmp);
- }
-
- return result;
+ char *key = mh_oauth_node_name_for_svc("credential-file", svc);
+ char *value = context_find(key);
+ free(key);
+
+ bool found = value;
+ if (found) {
+ if (*value == '/')
+ return mh_xstrdup(value);
+ } else
+ value = concat("oauth-", svc, NULL);
+
+ const char *md = m_maildir(value);
+ if (!found)
+ free(value);
+
+ return mh_xstrdup(md);
}
#endif