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