1 module jmap.api; 2 import jmap.types; 3 static import jmap.types; 4 5 version(SIL) 6 { 7 import kaleidic.sil.lang.handlers:Handlers; 8 import kaleidic.sil.lang.types : Variable,Function,SILdoc; 9 import kaleidic.sil.lang.builtins : Maybe; 10 11 void registerHandlersJmap(ref Handlers handlers) 12 { 13 import std.meta : AliasSeq; 14 handlers.openModule("jmap"); 15 scope(exit) handlers.closeModule(); 16 17 static foreach(T; AliasSeq!(Credentials, JmapSessionParams, Session, 18 Mailbox,MailboxRights,MailboxSortProperty,Filter,FilterOperator,FilterOperatorKind,FilterCondition,Comparator, Account, AccountParams, AccountCapabilities, SessionCoreCapabilities, Contact, ContactGroup, ContactInformation, JmapFile, EmailAddress, Envelope, ContactAddress, ResultReference, JmapResponseError,EmailProperty,EmailBodyProperty,Maybe)) 19 handlers.registerType!T; 20 21 static foreach(F; AliasSeq!(getSession, getSessionJson, wellKnownJmap,operatorAsFilter,filterCondition,addQuotes,uniqBy,mailboxPath,allMailboxPaths, 22 findMailboxPath)) 23 handlers.registerHandler!F; 24 } 25 } 26 27 version(SIL): 28 29 30 Variable[] uniqBy(Variable[] input, Function f) 31 { 32 import std.algorithm : uniq; 33 import std.array : array; 34 return input.uniq!((a,b) => f(a,b).get!bool).array; 35 } 36 37 string addQuotes(string s) 38 { 39 if (s.length <2 || s[0]=='"' || s[$-1] =='"') 40 return s; 41 return '"' ~ s ~ '"'; 42 } 43 44 45 struct JmapSessionParams 46 { 47 Credentials credentials; 48 string uri; 49 } 50 51 auto wellKnownJmap(string baseURI) 52 { 53 import std.format : format; 54 import std.algorithm : endsWith; 55 return baseURI.endsWith(".well-known/jmap") ? baseURI : format!"%s/.well-known/jmap"(baseURI); 56 } 57 58 string getSessionJson(JmapSessionParams params) 59 { 60 return getSessionJson(params.uri,params.credentials); 61 } 62 63 private string getSessionJson(string uri, Credentials credentials) 64 { 65 import requests : Request, BasicAuthentication; 66 auto req = Request(); 67 req.authenticator = new BasicAuthentication(credentials.user,credentials.pass); 68 auto result = cast(string) req.get(uri.wellKnownJmap).responseBody.data.idup; 69 return result; 70 } 71 72 Session getSession(JmapSessionParams params) 73 { 74 import asdf; 75 import std.string : strip; 76 import std.exception : enforce; 77 import std.algorithm : startsWith; 78 import std.stdio : writeln; 79 80 auto json = getSessionJson(params).strip; 81 writeln(json); 82 enforce(json.startsWith("{") || json.startsWith("["), "invalid json response: \n" ~ json); 83 auto ret = deserialize!Session(json); 84 ret.credentials = params.credentials; 85 return ret; 86 } 87 88