diff bcfee7b54757eb64cade34e476cf0dba672832f6 uncommitted --- a/sys/src/cmd/upas/fs/imap.c +++ b/sys/src/cmd/upas/fs/imap.c @@ -24,6 +24,7 @@ Cnolog = 1<<0, Ccram = 1<<1, Cntlm = 1<<2, + Coauth = 1<<3, /* flags */ Fssl = 1<<0, @@ -151,7 +152,7 @@ static void imap4cmd(Imap *imap, char *fmt, ...) { - char buf[256], *p; + char buf[1024], *p; va_list va; va_start(va, fmt); @@ -430,6 +431,8 @@ imap->cap |= Ccram; if(strcmp(p, "ntlm") == 0) imap->cap |= Cntlm; + if(strcmp(p, "xoauth2") == 0) + imap->cap |= Coauth; }else if(strcmp(t[i], "logindisabled") == 0) imap->cap |= Cnolog; } @@ -733,6 +736,38 @@ } static char* +imap4oauth(Imap *imap) +{ + char *s, *auth, *enc; + int n; + OAuth *oa; + + if(imap->user == nil) + return "user required for oauth"; + oa = auth_getoauth(auth_getkey, "proto=oauth service=imap server=%q user=%q", imap->host, imap->user); + if(oa == nil) + return "cannot find IMAP oauth token"; + + imap->tag = 1; + if((auth = smprint("user=%s\x01auth=Bearer %s\x01\x01", imap->user, oa->access_token)) == nil) + sysfatal("smprint: %r"); + if((enc = smprint("%[", auth) == nil) + sysfatal("smprint: %r"); + imap4cmd(imap, "authenticate xoauth2 %s", enc); + free(auth); + free(enc); + free(oa); + s = imap4resp(imap); + if(isokay(s)) + return nil; + imap4cmd(imap, ""); + s = imap4resp(imap); + if(isokay(s)) + return nil; + return s; +} + +static char* imap4passwd(Imap *imap) { char *s; @@ -762,6 +797,8 @@ e = imap4cram(imap); else if(imap->cap & Cntlm) e = imap4ntlm(imap); + else if(imap->cap & Coauth) + e = imap4oauth(imap); else e = imap4passwd(imap); if(e) ------------------------------------------ 9fans: 9fans Permalink: https://9fans.topicbox.com/groups/9fans/T6899bf3f0654295d-Mbcaea13458be56f2909ea6c3 Delivery options: https://9fans.topicbox.com/groups/9fans/subscription