mirror of
https://github.com/moparisthebest/mailiverse
synced 2025-01-10 13:08:03 -05:00
adds the service app which I forgot
This commit is contained in:
parent
76fe04658b
commit
0d5f66ab84
11
java/app/service/.classpath
Normal file
11
java/app/service/.classpath
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mailiverse.Core"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mailiverse.Ext.BouncyCastle"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mailiverse.Ext.JordanZimmerman"/>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/Mailiverse.Ext.Json"/>
|
||||||
|
<classpathentry kind="lib" path="lib/plugin.jar"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
17
java/app/service/.project
Normal file
17
java/app/service/.project
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>Mailiverse.App.Service</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
1
java/app/service/lib
Symbolic link
1
java/app/service/lib
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../lib
|
17
java/app/service/src/app/service/JSApplet.java
Normal file
17
java/app/service/src/app/service/JSApplet.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package app.service;
|
||||||
|
|
||||||
|
import java.applet.Applet;
|
||||||
|
|
||||||
|
import netscape.javascript.JSObject;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
|
||||||
|
public class JSApplet extends Applet
|
||||||
|
{
|
||||||
|
|
||||||
|
public Object getWindow(Callback callback)
|
||||||
|
{
|
||||||
|
return JSObject.getWindow(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
509
java/app/service/src/app/service/JSClient.java
Normal file
509
java/app/service/src/app/service/JSClient.java
Normal file
@ -0,0 +1,509 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import core.constants.ConstantsMailJson;
|
||||||
|
import core.constants.ConstantsClient;
|
||||||
|
import core.constants.ConstantsSettings;
|
||||||
|
import core.constants.ConstantsStorage;
|
||||||
|
import core.util.JSON_;
|
||||||
|
import core.util.JSON_.JSONException;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
import core.util.Pair;
|
||||||
|
import core.util.Strings;
|
||||||
|
|
||||||
|
import mail.client.Client;
|
||||||
|
import mail.client.model.Body;
|
||||||
|
import mail.client.model.Conversation;
|
||||||
|
import mail.client.model.Folder;
|
||||||
|
import mail.client.model.Header;
|
||||||
|
import mail.client.model.Identity;
|
||||||
|
import mail.client.model.Mail;
|
||||||
|
import mail.client.model.Original;
|
||||||
|
import mail.client.model.Settings;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSClient implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSClient.class);
|
||||||
|
|
||||||
|
Client client;
|
||||||
|
|
||||||
|
public JSClient (Client client)
|
||||||
|
{
|
||||||
|
this.client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#buildAddressList(java.lang.String)
|
||||||
|
*/
|
||||||
|
public List<Identity> buildAddressList(String addresses)
|
||||||
|
{
|
||||||
|
return client.getMaster().getAddressBook().parseAddressString(addresses);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#getDaysLeft(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public void getDaysLeft (Object callback) throws Exception
|
||||||
|
{
|
||||||
|
client.getHttpDelegate().execute(
|
||||||
|
"POST",
|
||||||
|
ConstantsClient.WEB_SERVER_TOMCAT + "DaysLeft",
|
||||||
|
null, false, false, Strings.toBytes(client.getMaster().getIdentity().getEmail()), new JSResult<String>(callback)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flushStore () throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("flushStore");
|
||||||
|
|
||||||
|
client.getMaster().getCacheManager().flush();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateStore () throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("flushStore");
|
||||||
|
|
||||||
|
client.getMaster().getCacheManager().update();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void debugStore () throws IOException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("debugStore");
|
||||||
|
|
||||||
|
client.getMaster().getCacheManager().debug();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSignatureHTML ()
|
||||||
|
{
|
||||||
|
String signature = client.getMaster().getCacheManager().getSettings().get(ConstantsSettings.SIGNATURE, "");
|
||||||
|
return ("\r\n\r\n" + signature + "\r\n").replaceAll("\r\n", "<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Body calculateReplyBody (MailI mail)
|
||||||
|
{
|
||||||
|
return calculateReplyBody(mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Body calculateReplyBody (Mail mail)
|
||||||
|
{
|
||||||
|
return client.getMaster().getActions().calculateSignaturedReplyBody(mail);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#sendMail(mail.client.core.Conversation, mail.client.core.Mail)
|
||||||
|
*/
|
||||||
|
public void sendMail(Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getActions().sendMail(conversation, mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendMail(Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
sendMail(conversation, mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#saveMail(mail.client.core.Conversation, mail.client.core.Mail)
|
||||||
|
*/
|
||||||
|
public void saveMail(Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getActions().saveMail(conversation, mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveMail(Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
saveMail(conversation, mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#deleteMail(mail.client.core.Conversation, mail.client.core.Mail)
|
||||||
|
*/
|
||||||
|
public void deleteMail(Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getActions().deleteMail(conversation,mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteMail(Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
deleteMail(conversation, mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#reindexConversation(mail.client.core.Conversation)
|
||||||
|
*/
|
||||||
|
public void reindexConversation(Conversation conversation)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getActions().reindexConversation(conversation);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#deleteConversation(mail.client.core.Conversation)
|
||||||
|
*/
|
||||||
|
public void deleteConversation(Conversation conversation)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getActions().deleteConversation(conversation);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#checkMail()
|
||||||
|
*/
|
||||||
|
public void checkMail ()
|
||||||
|
{
|
||||||
|
log.debug("checkMail");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.getMaster().getArrivalsMonitor().check();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#getFolders()
|
||||||
|
*/
|
||||||
|
public String[] getSystemFolders ()
|
||||||
|
{
|
||||||
|
log.debug("getFolders");
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
|
||||||
|
List<Folder> folders = client.getMaster().getIndexer().getSystemFolders();
|
||||||
|
for (Folder f : folders)
|
||||||
|
if (f.isLoaded())
|
||||||
|
result.add(f.getId().toString());
|
||||||
|
|
||||||
|
return result.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getUserFolders ()
|
||||||
|
{
|
||||||
|
log.debug("getFolders");
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
|
||||||
|
List<Folder> folders = client.getMaster().getIndexer().getUserFolders();
|
||||||
|
for (Folder f : folders)
|
||||||
|
if (f.isLoaded())
|
||||||
|
result.add(f.getId().toString());
|
||||||
|
|
||||||
|
return result.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#getFolder(java.lang.String)
|
||||||
|
*/
|
||||||
|
public Folder getSystemFolder (String folder)
|
||||||
|
{
|
||||||
|
log.debug("getSystemFolder");
|
||||||
|
List<Folder> folders = client.getMaster().getIndexer().getSystemFolders();
|
||||||
|
for (Folder f : folders)
|
||||||
|
if (f.isLoaded())
|
||||||
|
if (f.getId().toString() == folder)
|
||||||
|
return f;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Folder getUserFolder (String folder)
|
||||||
|
{
|
||||||
|
log.debug("getUserFolder");
|
||||||
|
List<Folder> folders = client.getMaster().getIndexer().getUserFolders();
|
||||||
|
for (Folder f : folders)
|
||||||
|
if (f.isLoaded())
|
||||||
|
if (f.getId().toString() == folder)
|
||||||
|
return f;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#replyTo(mail.client.core.Conversation, mail.client.core.Mail, mail.client.core.Body)
|
||||||
|
*/
|
||||||
|
public Mail replyTo (Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return client.getMaster().getActions().replyTo(conversation, mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MailI replyTo (Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
return new MailI(replyTo(conversation, mail.deref()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#replyToAll(mail.client.core.Conversation, mail.client.core.Mail, mail.client.core.Body)
|
||||||
|
*/
|
||||||
|
public Mail replyToAll (Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return client.getMaster().getActions().replyToAll(conversation, mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MailI replyToAll (Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
return new MailI(replyToAll(conversation, mail.deref()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#forward(mail.client.core.Conversation, mail.client.core.Mail)
|
||||||
|
*/
|
||||||
|
public Mail forward (Conversation conversation, Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return client.getMaster().getActions().forward(conversation, mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MailI forward (Conversation conversation, MailI mail)
|
||||||
|
{
|
||||||
|
return new MailI(forward(conversation, mail.deref()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] newMail ()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Pair<Conversation,Mail> pair = client.getMaster().getActions().newMail();
|
||||||
|
return new Object[] { pair.first, pair.second };
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#getAddressList()
|
||||||
|
*/
|
||||||
|
public Identity[] getAddressList ()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return client.getMaster().getAddressBook().getAddressList().toArray(new Identity[0]);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Original getOriginal(Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("getOriginal: ",new Date());
|
||||||
|
|
||||||
|
String originalKey = mail.getHeader().getOriginalKey();
|
||||||
|
return client.getMaster().getStore().getOriginal(originalKey);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Original getOriginal(MailI mail)
|
||||||
|
{
|
||||||
|
return getOriginal(mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadAttachments(Mail mail)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("loadAttachments: ",new Date());
|
||||||
|
client.getMaster().getStore().loadAttachments(mail);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadAttachments(MailI mail)
|
||||||
|
{
|
||||||
|
loadAttachments(mail.deref());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSAppletInterface#getMinimalJSONForConversations(java.lang.Object[])
|
||||||
|
*/
|
||||||
|
public String getMinimalJSONForConversations (Object[] conversations) throws JSONException
|
||||||
|
{
|
||||||
|
Object a = JSON_.newArray();
|
||||||
|
|
||||||
|
for (Object o : conversations)
|
||||||
|
{
|
||||||
|
Conversation c = (Conversation)o;
|
||||||
|
|
||||||
|
Object json;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
json = JSON_.newObject();
|
||||||
|
|
||||||
|
JSON_.put(json, "loaded", JSON_.newBoolean(c.isLoaded()));
|
||||||
|
if (c.isLoaded())
|
||||||
|
{
|
||||||
|
List<String> shortNames = new ArrayList<String>(c.getHeader().getAuthors().size());
|
||||||
|
for (Identity i : c.getHeader().getAuthors())
|
||||||
|
shortNames.add(i.getShortName());
|
||||||
|
|
||||||
|
Header h = c.getHeader();
|
||||||
|
JSON_.put(json, "participants", JSON_.newString(Strings.concat(shortNames,", ")));
|
||||||
|
JSON_.put(json, "numItems", JSON_.newNumber(c.getNumItems()));
|
||||||
|
JSON_.put(json, "subject", JSON_.newString(h.getSubject()!=null?h.getSubject():"No subject"));
|
||||||
|
JSON_.put(json, "brief", JSON_.newString(h.getBrief()!=null?h.getBrief():"No brief"));
|
||||||
|
JSON_.put(json, "date",JSON_.newString(c.getHeader().getRelativeDate()));
|
||||||
|
JSON_.put(json, "state", JSON_.newString(c.getHeader().getTransportState().toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.debug("this " + c + " header " + c.getHeader());
|
||||||
|
log.exception(e);
|
||||||
|
json = JSON_.newObject();
|
||||||
|
JSON_.put(json, "loaded", JSON_.newBoolean(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSON_.add(a,json);
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void newUserFolder ()
|
||||||
|
{
|
||||||
|
client.getMaster().getIndexer().newUserFolder("New Folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteUserFolder (String userFolder)
|
||||||
|
{
|
||||||
|
client.getMaster().getIndexer().deleteUserFolder(getUserFolder(userFolder));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addToUserFolder(String userFolder, Conversation conversation)
|
||||||
|
{
|
||||||
|
client.getMaster().getIndexer().addToUserFolder(
|
||||||
|
getUserFolder(userFolder), conversation
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeFromUserFolder(String userFolder, Conversation conversation)
|
||||||
|
{
|
||||||
|
client.getMaster().getIndexer().removeFromUserFolder(
|
||||||
|
getUserFolder(userFolder), conversation
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Settings getSettings ()
|
||||||
|
{
|
||||||
|
return client.getMaster().getCacheManager().getSettings();
|
||||||
|
}
|
||||||
|
}
|
55
java/app/service/src/app/service/JSEventPropagator.java
Normal file
55
java/app/service/src/app/service/JSEventPropagator.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
|
||||||
|
import core.util.LogNull;
|
||||||
|
import mail.client.EventDispatcher;
|
||||||
|
import mail.client.EventPropagator;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSEventPropagator extends EventDispatcher implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull (JSEventPropagator.class);
|
||||||
|
|
||||||
|
Object delegate;
|
||||||
|
|
||||||
|
public JSEventPropagator ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doSignal (String event, Object... parameters)
|
||||||
|
{
|
||||||
|
super.doSignal(event, parameters);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!event.equals(EventPropagator.INVOKE))
|
||||||
|
if (delegate != null)
|
||||||
|
JSInvoker.invoke(delegate,
|
||||||
|
"signal",
|
||||||
|
new Object[] {
|
||||||
|
event,
|
||||||
|
(parameters != null && parameters.length > 0) ?
|
||||||
|
parameters[0] :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDelegate (Object delegate)
|
||||||
|
{
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
}
|
114
java/app/service/src/app/service/JSHttpDelegate.java
Normal file
114
java/app/service/src/app/service/JSHttpDelegate.java
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
import com.google.gwt.core.client.JsArray;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.util.Base64;
|
||||||
|
|
||||||
|
import core.util.HttpDelegate;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.Strings;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSHttpDelegate extends HttpDelegate implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSHttpDelegate.class);
|
||||||
|
|
||||||
|
Object delegate;
|
||||||
|
|
||||||
|
public JSHttpDelegate (Object delegate)
|
||||||
|
{
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doExecute (String action, String url, String[][] headers, boolean binaryInput, boolean binaryOutput, byte[] contents, Callback callback) throws Exception
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
JSInvoker.invoke (
|
||||||
|
delegate,
|
||||||
|
"executeURL",
|
||||||
|
new Object[] {
|
||||||
|
action, url, headers, binaryInput, binaryOutput,
|
||||||
|
binaryInput ?
|
||||||
|
((contents!=null) ? Base64.encode(contents) : null) :
|
||||||
|
((contents!=null) ? Strings.toString(contents) : null),
|
||||||
|
|
||||||
|
new CallbackDefault(url, binaryOutput) {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object...arguments) throws Exception
|
||||||
|
{
|
||||||
|
String data = (String)arguments[0];
|
||||||
|
JsArray jsHeaders = (JsArray) arguments[1];
|
||||||
|
String[][] headers = new String[jsHeaders.length()][];
|
||||||
|
for (int i=0; i<jsHeaders.length(); ++i)
|
||||||
|
{
|
||||||
|
JsArray header = jsHeaders.get(i).cast();
|
||||||
|
headers[i] = new String[] {
|
||||||
|
header.get(0).toString(),
|
||||||
|
header.get(1).toString()
|
||||||
|
} ;
|
||||||
|
}
|
||||||
|
|
||||||
|
String url = V(0);
|
||||||
|
boolean binaryOutput = V(1);
|
||||||
|
|
||||||
|
log.debug("doExecute callback ",url,binaryOutput);
|
||||||
|
|
||||||
|
if (data == null)
|
||||||
|
{
|
||||||
|
log.debug("failed to acquire resource", url);
|
||||||
|
next(new IOException("Failed to acquire resource"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
log.debug("succeeded in acquiring resource", url);
|
||||||
|
|
||||||
|
if (binaryOutput)
|
||||||
|
{
|
||||||
|
byte[] bin = data != null ? Base64.decode(data) : null;
|
||||||
|
next(bin, headers);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
next(data, headers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.setReturn(callback)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
catch (Throwable e)
|
||||||
|
{
|
||||||
|
callback.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute (String action, String url, String[][] headers, boolean binaryInput, boolean binaryOutput, byte[] contents, Callback callback)
|
||||||
|
{
|
||||||
|
log.debug("JSHttpDelegate.execute ",url);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
doExecute (action, url, headers, binaryInput, binaryOutput, contents, callback);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
callback.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
java/app/service/src/app/service/JSInvoker.java
Normal file
23
java/app/service/src/app/service/JSInvoker.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package app.service;
|
||||||
|
|
||||||
|
import netscape.javascript.JSObject;
|
||||||
|
|
||||||
|
public class JSInvoker
|
||||||
|
{
|
||||||
|
public static Object invoke(Object o, String f, Object[] args)
|
||||||
|
{
|
||||||
|
JSObject js = (JSObject)o;
|
||||||
|
return js.call(f, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getMember(Object o, String member)
|
||||||
|
{
|
||||||
|
JSObject js = (JSObject)o;
|
||||||
|
return js.getMember(member);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object wrap(Object o)
|
||||||
|
{
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
}
|
249
java/app/service/src/app/service/JSRefill.java
Normal file
249
java/app/service/src/app/service/JSRefill.java
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
import mail.auth.MailServerAuthenticatorNoThread;
|
||||||
|
import mail.client.EventPropagator;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackWithVariables;
|
||||||
|
import core.constants.ConstantsClient;
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.util.HttpDelegate;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSRefill implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSSignUp.class);
|
||||||
|
|
||||||
|
Main main;
|
||||||
|
|
||||||
|
JSRefill (Main main)
|
||||||
|
{
|
||||||
|
this.main = main;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class RefillInfo {
|
||||||
|
public static enum Storage { Mailiverse, Dropbox };
|
||||||
|
|
||||||
|
String email;
|
||||||
|
JSResult<Boolean> callback;
|
||||||
|
|
||||||
|
String paymentMethod;
|
||||||
|
|
||||||
|
String stripeCardNumber, stripeCardExpMonth, stripeCardExpYear, stripeCardCVC;
|
||||||
|
String stripeTransactionID;
|
||||||
|
|
||||||
|
String bitpayToken;
|
||||||
|
String amount;
|
||||||
|
|
||||||
|
RefillInfo (
|
||||||
|
String email, String amount,
|
||||||
|
JSResult<Boolean> callback
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.email = email;
|
||||||
|
this.callback = callback;
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initializeStripe (
|
||||||
|
String stripeCardNumber, String stripeCardCVC, String stripeCardExpMonth, String stripeCardExpYear
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.paymentMethod = "stripe";
|
||||||
|
this.stripeCardNumber = stripeCardNumber;
|
||||||
|
this.stripeCardCVC = stripeCardCVC;
|
||||||
|
this.stripeCardExpMonth = stripeCardExpMonth;
|
||||||
|
this.stripeCardExpYear = stripeCardExpYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initializeBitPay (String bitpayToken)
|
||||||
|
{
|
||||||
|
this.paymentMethod = "bitpay";
|
||||||
|
this.bitpayToken = bitpayToken;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void makePayment (
|
||||||
|
String name,
|
||||||
|
String amount,
|
||||||
|
String paymentMethod,
|
||||||
|
Object paymentDetails,
|
||||||
|
Object callback
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
log.debug("refill", name, amount, paymentMethod);
|
||||||
|
|
||||||
|
RefillInfo info = new RefillInfo(
|
||||||
|
name, amount,
|
||||||
|
new JSResult<Boolean>(callback)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (paymentMethod.equals("stripe"))
|
||||||
|
info.initializeStripe(
|
||||||
|
JSInvoker.getMember(paymentDetails, "number").toString(),
|
||||||
|
JSInvoker.getMember(paymentDetails, "cvc").toString(),
|
||||||
|
JSInvoker.getMember(paymentDetails, "month").toString(),
|
||||||
|
JSInvoker.getMember(paymentDetails, "year").toString()
|
||||||
|
);
|
||||||
|
else
|
||||||
|
if (paymentMethod.equals("bitpay"))
|
||||||
|
info.initializeBitPay(
|
||||||
|
JSInvoker.getMember(paymentDetails, "token").toString()
|
||||||
|
);
|
||||||
|
|
||||||
|
main.eventPropagator.signal(
|
||||||
|
EventPropagator.INVOKE,
|
||||||
|
new Callback() {
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
refill_step_requestPaymentStripeStep1((RefillInfo)arguments[0]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
info
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void test (String user, Object callback) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("test");
|
||||||
|
JSResult<Object> result = new JSResult<Object>(callback);
|
||||||
|
|
||||||
|
String url = ConstantsClient.MAIL_SERVER_WEBSOCKET;
|
||||||
|
|
||||||
|
MailServerAuthenticatorNoThread.testCreate_(
|
||||||
|
user,
|
||||||
|
new JSStreamSessionWebSocket(url, main.delegate)
|
||||||
|
).addCallback(result).invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void refill_step_requestPayment(RefillInfo info)
|
||||||
|
{
|
||||||
|
refill_step_requestPaymentStripeStep1(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refill_step_requestPaymentStripeStep1(RefillInfo info)
|
||||||
|
{
|
||||||
|
final String stripePublishableKey = "YOUR_STRIPE_TOKEN";
|
||||||
|
|
||||||
|
log.debug("refill_step_requestPaymentStripeStep1");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String url =
|
||||||
|
"https://api.stripe.com/v1/tokens?" +
|
||||||
|
"card[number]=" + info.stripeCardNumber +
|
||||||
|
"&card[exp_month]=" + info.stripeCardExpMonth +
|
||||||
|
"&card[exp_year]=" + info.stripeCardExpYear +
|
||||||
|
"&card[cvc]=" + info.stripeCardCVC +
|
||||||
|
"&key=" + stripePublishableKey +
|
||||||
|
"&_method=POST";
|
||||||
|
|
||||||
|
JSHttpDelegate http = new JSHttpDelegate(main.delegate);
|
||||||
|
http.execute(
|
||||||
|
HttpDelegate.GET, url, null,
|
||||||
|
false, false, null,
|
||||||
|
|
||||||
|
new CallbackWithVariables(info) {
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestPaymentStripeStep1 callback");
|
||||||
|
RefillInfo info = V(0);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (arguments[0] instanceof Exception)
|
||||||
|
throw (Exception)arguments[0];
|
||||||
|
|
||||||
|
String response = (String)arguments[0];
|
||||||
|
JSONObject o = new JSONObject(response);
|
||||||
|
String stripeTransactionID = o.getString("id");
|
||||||
|
info.stripeTransactionID = stripeTransactionID;
|
||||||
|
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Requested CreditCard Stripe Token." });
|
||||||
|
refill_step_requestPaymentStripeStep2(info);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
info.callback.invoke(new Exception("Could not request Stripe token, no charge was made."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
info.callback.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refill_step_requestPaymentStripeStep2(RefillInfo info)
|
||||||
|
{
|
||||||
|
log.debug("refil_step_requestPaymentStripeStep2");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String url =
|
||||||
|
ConstantsClient.WEB_SERVER_TOMCAT + "StripePayment" +
|
||||||
|
"?email=" + info.email +
|
||||||
|
"&stripeTransactionID=" + info.stripeTransactionID +
|
||||||
|
"&amount=" + info.amount;
|
||||||
|
|
||||||
|
JSHttpDelegate http = new JSHttpDelegate(main.delegate);
|
||||||
|
http.execute(HttpDelegate.GET, url, null, false, false, null, new CallbackWithVariables(info) {
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestPaymentStripeStep2 callback");
|
||||||
|
RefillInfo info = V(0);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (arguments[0] instanceof Exception)
|
||||||
|
throw (Exception)arguments[0];
|
||||||
|
|
||||||
|
String response = (String)arguments[0];
|
||||||
|
JSONObject o = new JSONObject(response);
|
||||||
|
if (o.has("error"))
|
||||||
|
{
|
||||||
|
throw new Exception(o.getJSONObject("error").getString("message"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[]
|
||||||
|
{ "Purchase succeeded.\n\n" + "Please save the reciept: "+ o.getString("id") }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
refill_finish(info);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
info.callback.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
info.callback.invoke(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refill_finish(RefillInfo info)
|
||||||
|
{
|
||||||
|
log.debug("signUp_finish");
|
||||||
|
info.callback.invoke(true);
|
||||||
|
log.debug("signUp_finish_finished");
|
||||||
|
}
|
||||||
|
}
|
125
java/app/service/src/app/service/JSResult.java
Normal file
125
java/app/service/src/app/service/JSResult.java
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.exceptions.PublicMessageException;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSResult<T> extends Callback implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSResult.class);
|
||||||
|
|
||||||
|
boolean finished;
|
||||||
|
T o;
|
||||||
|
Exception e;
|
||||||
|
Object callback;
|
||||||
|
|
||||||
|
public JSResult ()
|
||||||
|
{
|
||||||
|
finished = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSResult (Object callback)
|
||||||
|
{
|
||||||
|
this();
|
||||||
|
this.callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#hasException()
|
||||||
|
*/
|
||||||
|
public boolean hasException ()
|
||||||
|
{
|
||||||
|
return e != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#hasObject()
|
||||||
|
*/
|
||||||
|
public boolean hasObject ()
|
||||||
|
{
|
||||||
|
return o != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#isFinished()
|
||||||
|
*/
|
||||||
|
public synchronized boolean isFinished ()
|
||||||
|
{
|
||||||
|
return finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#getObject()
|
||||||
|
*/
|
||||||
|
public Object getObject ()
|
||||||
|
{
|
||||||
|
return JSInvoker.wrap(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#getException()
|
||||||
|
*/
|
||||||
|
public Object getException ()
|
||||||
|
{
|
||||||
|
return JSInvoker.wrap(
|
||||||
|
e != null ?
|
||||||
|
new PublicMessageException(e.getMessage()) :
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void setObject (T o)
|
||||||
|
{
|
||||||
|
this.o = o;
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void setException (Exception e)
|
||||||
|
{
|
||||||
|
this.e = e;
|
||||||
|
finished = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("invoke",arguments[0]);
|
||||||
|
|
||||||
|
if (arguments[0] instanceof Exception)
|
||||||
|
setException((Exception)arguments[0]);
|
||||||
|
else
|
||||||
|
setObject((T)arguments[0]);
|
||||||
|
|
||||||
|
if (callback != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
JSInvoker.invoke(callback, "invoke", new Object[] {this});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.error(e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.JSResultInterface#getCallback()
|
||||||
|
*/
|
||||||
|
public Object getCallback()
|
||||||
|
{
|
||||||
|
return callback;
|
||||||
|
}
|
||||||
|
}
|
585
java/app/service/src/app/service/JSSignUp.java
Normal file
585
java/app/service/src/app/service/JSSignUp.java
Normal file
@ -0,0 +1,585 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import core.srp.client.SRPClientListener;
|
||||||
|
import java.util.Date;
|
||||||
|
import core.util.SecureRandom;
|
||||||
|
import key.auth.KeyServerAuthenticatorNoThread;
|
||||||
|
import mail.auth.MailServerAuthenticatorNoThread;
|
||||||
|
import mail.client.EventPropagator;
|
||||||
|
import core.constants.ConstantsDropbox;
|
||||||
|
|
||||||
|
import core.util.Base64;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackChain;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.callback.CallbackWithVariables;
|
||||||
|
import core.constants.ConstantsS3;
|
||||||
|
import core.constants.ConstantsEnvironmentKeys;
|
||||||
|
import core.constants.ConstantsClient;
|
||||||
|
import core.constants.ConstantsStorage;
|
||||||
|
import core.constants.ConstantsVersion;
|
||||||
|
import core.crypt.CryptorRSAFactory;
|
||||||
|
import core.crypt.KeyPairFromPassword;
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.util.Environment;
|
||||||
|
import core.util.HttpDelegate;
|
||||||
|
import core.util.JSON_;
|
||||||
|
import core.util.JSON_.JSONException;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.Pair;
|
||||||
|
import core.util.Strings;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
public class JSSignUp implements Exportable, SRPClientListener
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSSignUp.class);
|
||||||
|
static SecureRandom random = new SecureRandom();
|
||||||
|
|
||||||
|
Main main;
|
||||||
|
|
||||||
|
JSSignUp (Main main)
|
||||||
|
{
|
||||||
|
this.main = main;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requestAuthorizationToken (Object callback)
|
||||||
|
{
|
||||||
|
JSResult<String> result = new JSResult<String>(callback);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String url =
|
||||||
|
"https://api.dropbox.com/1/oauth/request_token" +
|
||||||
|
"?oauth_consumer_key=" + ConstantsClient.DROPBOX_APPKEY +
|
||||||
|
"&oauth_signature_method=PLAINTEXT" +
|
||||||
|
"&oauth_signature=" + ConstantsClient.DROPBOX_APPSECRET + "%26" +
|
||||||
|
"&oauth_nonce=\"" + (new Date()).getTime() + "\"";
|
||||||
|
|
||||||
|
JSHttpDelegate http = new JSHttpDelegate(main.delegate);
|
||||||
|
http.execute(HttpDelegate.GET, url, null, false, false, null, new CallbackWithVariables(result) {
|
||||||
|
public void invoke(Object... arguments)
|
||||||
|
{
|
||||||
|
JSResult<String> result = (JSResult<String>)V(0);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (arguments[0] instanceof Exception)
|
||||||
|
throw (Exception)arguments[0];
|
||||||
|
|
||||||
|
String response = (String)arguments[0];
|
||||||
|
String token=null, tokenSecret=null;
|
||||||
|
String[] parts = response.split("&");
|
||||||
|
for (String part : parts)
|
||||||
|
{
|
||||||
|
String[] keyValue = part.split("=");
|
||||||
|
String key = keyValue[0];
|
||||||
|
String value = keyValue[1];
|
||||||
|
|
||||||
|
if (key.equalsIgnoreCase("oauth_token_secret"))
|
||||||
|
tokenSecret = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("oauth_token"))
|
||||||
|
token = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object o = JSON_.newObject();
|
||||||
|
JSON_.put(o, "key", JSON_.newString(token));
|
||||||
|
JSON_.put(o, "secret", JSON_.newString(tokenSecret));
|
||||||
|
|
||||||
|
result.invoke(o.toString());
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
result.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
result.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void test (String user, Object callback) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("test");
|
||||||
|
JSResult<Object> result = new JSResult<Object>(callback);
|
||||||
|
|
||||||
|
String url = ConstantsClient.MAIL_SERVER_WEBSOCKET;
|
||||||
|
|
||||||
|
MailServerAuthenticatorNoThread.testCreate_(
|
||||||
|
user,
|
||||||
|
new JSStreamSessionWebSocket(url, main.delegate)
|
||||||
|
).addCallback(result).invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
static class SignUpInfo {
|
||||||
|
public static enum Storage { Mailiverse, Dropbox };
|
||||||
|
|
||||||
|
String name, password, captchaToken;
|
||||||
|
Environment serverEnvironment, clientEnvironment, completeEnvironment;
|
||||||
|
JSResult<Boolean> callback;
|
||||||
|
|
||||||
|
KeyPairFromPassword keyPair;
|
||||||
|
|
||||||
|
Storage storage;
|
||||||
|
String storageRegion;
|
||||||
|
|
||||||
|
String dropboxAppKey, dropboxAppSecret;
|
||||||
|
String dropboxAuthToken, dropboxAuthSecret;
|
||||||
|
String dropboxUserToken, dropboxUserSecret;
|
||||||
|
|
||||||
|
|
||||||
|
String awsBucketName, awsBucketRegion;
|
||||||
|
String awsWriteAccessKey, awsWriteSecretKey;
|
||||||
|
String awsReadWriteAccessKey, awsReadWriteSecretKey;
|
||||||
|
|
||||||
|
String smtpPassword;
|
||||||
|
byte[] publicKey;
|
||||||
|
byte[] privateKey;
|
||||||
|
|
||||||
|
String stripeCardNumber, stripeCardExpMonth, stripeCardExpYear, stripeCardCVC;
|
||||||
|
String stripeTransactionID;
|
||||||
|
int paymentAmount = 1;
|
||||||
|
|
||||||
|
SignUpInfo (
|
||||||
|
String name, String password, String captchaToken,
|
||||||
|
JSResult<Boolean> callback
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.password = password;
|
||||||
|
this.captchaToken = captchaToken;
|
||||||
|
this.callback = callback;
|
||||||
|
this.smtpPassword = "" + Math.abs(random.nextLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
void intializeStorageDropbox (
|
||||||
|
String appKey, String appSecret,
|
||||||
|
String authToken, String authSecret
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.storage = Storage.Dropbox;
|
||||||
|
this.dropboxAppKey = appKey;
|
||||||
|
this.dropboxAppSecret = appSecret;
|
||||||
|
this.dropboxAuthToken = authToken;
|
||||||
|
this.dropboxAuthSecret = authSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initializeStorageMailiverse (String storageRegion)
|
||||||
|
{
|
||||||
|
this.storage = Storage.Mailiverse;
|
||||||
|
this.storageRegion = storageRegion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDropboxInfo (String userToken, String userSecret)
|
||||||
|
{
|
||||||
|
this.dropboxUserToken = userToken;
|
||||||
|
this.dropboxUserSecret = userSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAWSInfo (
|
||||||
|
String awsBucketName, String awsBucketRegion,
|
||||||
|
String awsWriteAccessKey, String awsWriteSecretKey,
|
||||||
|
String awsReadWriteAccessKey, String awsReadWriteSecretKey)
|
||||||
|
{
|
||||||
|
this.awsBucketName = awsBucketName;
|
||||||
|
this.awsBucketRegion = awsBucketRegion;
|
||||||
|
this.awsWriteAccessKey = awsWriteAccessKey;
|
||||||
|
this.awsWriteSecretKey = awsWriteSecretKey;
|
||||||
|
this.awsReadWriteAccessKey = awsReadWriteAccessKey;
|
||||||
|
this.awsReadWriteSecretKey = awsReadWriteSecretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculateRSA (Callback callback) throws NoSuchAlgorithmException
|
||||||
|
{
|
||||||
|
new CryptorRSAFactory().generate(2048, new CallbackDefault() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
Pair<byte[], byte[]> pair = (Pair<byte[], byte[]>)arguments[0];
|
||||||
|
|
||||||
|
publicKey = pair.first;
|
||||||
|
privateKey = pair.second;
|
||||||
|
|
||||||
|
callback.invoke();
|
||||||
|
}
|
||||||
|
}.setReturn(callback)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculateEnvironmentDropbox ()
|
||||||
|
{
|
||||||
|
String handler = ConstantsStorage.HANDLER_DROPBOX;
|
||||||
|
String prefix = handler + "/";
|
||||||
|
|
||||||
|
serverEnvironment = new Environment();
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.HANDLER, handler);
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.SMTP_PASSWORD, smtpPassword);
|
||||||
|
serverEnvironment.put(prefix + ConstantsDropbox.DropboxUserPrefix, name);
|
||||||
|
serverEnvironment.put(prefix + ConstantsDropbox.DropboxAppKey, dropboxAppKey);
|
||||||
|
serverEnvironment.put(prefix + ConstantsDropbox.DropboxAppSecret, dropboxAppSecret);
|
||||||
|
serverEnvironment.put(prefix + ConstantsDropbox.DropboxTokenKey, dropboxUserToken);
|
||||||
|
serverEnvironment.put(prefix + ConstantsDropbox.DropboxTokenSecret, dropboxUserSecret);
|
||||||
|
serverEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY,
|
||||||
|
Base64.encode(publicKey)
|
||||||
|
);
|
||||||
|
|
||||||
|
clientEnvironment = new Environment();
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.HANDLER, handler);
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.SMTP_PASSWORD, smtpPassword);
|
||||||
|
clientEnvironment.put(prefix + ConstantsDropbox.DropboxUserPrefix, name);
|
||||||
|
clientEnvironment.put(prefix + ConstantsDropbox.DropboxAppKey, dropboxAppKey);
|
||||||
|
clientEnvironment.put(prefix + ConstantsDropbox.DropboxAppSecret, dropboxAppSecret);
|
||||||
|
clientEnvironment.put(prefix + ConstantsDropbox.DropboxTokenKey, dropboxUserToken);
|
||||||
|
clientEnvironment.put(prefix + ConstantsDropbox.DropboxTokenSecret, dropboxUserSecret);
|
||||||
|
clientEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY,
|
||||||
|
Base64.encode(publicKey)
|
||||||
|
);
|
||||||
|
clientEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PRIVATE_DECRYPTION_KEY,
|
||||||
|
Base64.encode(privateKey)
|
||||||
|
);
|
||||||
|
|
||||||
|
completeEnvironment = new Environment();
|
||||||
|
completeEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
completeEnvironment.addChildEnvironment(ConstantsEnvironmentKeys.SERVER_ENVIRONMENT, serverEnvironment);
|
||||||
|
completeEnvironment.addChildEnvironment(ConstantsEnvironmentKeys.CLIENT_ENVIRONMENT, clientEnvironment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculateEnvironmentAWS ()
|
||||||
|
{
|
||||||
|
String handler = ConstantsStorage.HANDLER_S3;
|
||||||
|
String prefix = handler + "/";
|
||||||
|
|
||||||
|
serverEnvironment = new Environment();
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.HANDLER, handler);
|
||||||
|
serverEnvironment.put(ConstantsEnvironmentKeys.SMTP_PASSWORD, smtpPassword);
|
||||||
|
serverEnvironment.put(prefix + ConstantsS3.AWSAccessKeyId, awsWriteAccessKey);
|
||||||
|
serverEnvironment.put(prefix + ConstantsS3.AWSSecretKey, awsWriteSecretKey);
|
||||||
|
serverEnvironment.put(prefix + ConstantsS3.AWSBucketName, awsBucketName);
|
||||||
|
serverEnvironment.put(prefix + ConstantsS3.AWSBucketRegion, awsBucketRegion);
|
||||||
|
serverEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY,
|
||||||
|
Base64.encode(publicKey)
|
||||||
|
);
|
||||||
|
|
||||||
|
clientEnvironment = new Environment();
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.HANDLER, handler);
|
||||||
|
clientEnvironment.put(ConstantsEnvironmentKeys.SMTP_PASSWORD, smtpPassword);
|
||||||
|
clientEnvironment.put(prefix + ConstantsS3.AWSAccessKeyId, awsReadWriteAccessKey);
|
||||||
|
clientEnvironment.put(prefix + ConstantsS3.AWSSecretKey, awsReadWriteSecretKey);
|
||||||
|
clientEnvironment.put(prefix + ConstantsS3.AWSBucketName, awsBucketName);
|
||||||
|
clientEnvironment.put(prefix + ConstantsS3.AWSBucketRegion, awsBucketRegion);
|
||||||
|
clientEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY,
|
||||||
|
Base64.encode(publicKey)
|
||||||
|
);
|
||||||
|
clientEnvironment.put(
|
||||||
|
ConstantsEnvironmentKeys.PRIVATE_DECRYPTION_KEY,
|
||||||
|
Base64.encode(privateKey)
|
||||||
|
);
|
||||||
|
|
||||||
|
completeEnvironment = new Environment();
|
||||||
|
completeEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION);
|
||||||
|
completeEnvironment.addChildEnvironment(ConstantsEnvironmentKeys.SERVER_ENVIRONMENT, serverEnvironment);
|
||||||
|
completeEnvironment.addChildEnvironment(ConstantsEnvironmentKeys.CLIENT_ENVIRONMENT, clientEnvironment);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculateEnvironment ()
|
||||||
|
{
|
||||||
|
if (storage == Storage.Dropbox)
|
||||||
|
calculateEnvironmentDropbox();
|
||||||
|
else
|
||||||
|
if (storage == Storage.Mailiverse)
|
||||||
|
calculateEnvironmentAWS();
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public void signUp (
|
||||||
|
String storage,
|
||||||
|
String storageInfo,
|
||||||
|
String name, String password, String captchaToken,
|
||||||
|
String dropboxUserKey, String dropboxUserSecret,
|
||||||
|
Object callback
|
||||||
|
) throws JSONException
|
||||||
|
{
|
||||||
|
log.debug("signUp", name, password, captchaToken, dropboxUserKey, dropboxUserSecret);
|
||||||
|
|
||||||
|
SignUpInfo info = new SignUpInfo(
|
||||||
|
name, password, captchaToken,
|
||||||
|
new JSResult<Boolean>(callback)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (storage.equals("dropbox"))
|
||||||
|
info.intializeStorageDropbox(ConstantsClient.DROPBOX_APPKEY, ConstantsClient.DROPBOX_APPSECRET, dropboxUserKey, dropboxUserSecret);
|
||||||
|
else
|
||||||
|
if (storage.equals("mailiverse"))
|
||||||
|
info.initializeStorageMailiverse(JSON_.getString(JSON_.parse(storageInfo), "region"));
|
||||||
|
|
||||||
|
CallbackChain signUpChain = new CallbackChain();
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_createRSA");
|
||||||
|
|
||||||
|
SignUpInfo info = (SignUpInfo)V(0);
|
||||||
|
info.calculateRSA(callback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_genKeyPair");
|
||||||
|
|
||||||
|
SignUpInfo info = (SignUpInfo)V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Creating verification key pair." });
|
||||||
|
info.keyPair = new KeyPairFromPassword(info.password);
|
||||||
|
info.keyPair.generate_().addCallback(callback).invoke();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_createStorage");
|
||||||
|
|
||||||
|
SignUpInfo info = (SignUpInfo)V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Creating storage space." });
|
||||||
|
signUp_step_requestAccess(info, callback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_createEnvironments");
|
||||||
|
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Calculating environments." });
|
||||||
|
info.calculateEnvironment();
|
||||||
|
callback.invoke();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_createUser");
|
||||||
|
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Creating user account." });
|
||||||
|
createUser(
|
||||||
|
info.name, info.keyPair, info.captchaToken,
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_enableServer");
|
||||||
|
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Enabling server." });
|
||||||
|
putServerEnvironment(
|
||||||
|
info.name, info.keyPair, info.serverEnvironment,
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
signUpChain.addCallback(new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
log.debug("signUp_step_enableServer");
|
||||||
|
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Enabling client." });
|
||||||
|
putClientEnvironment(
|
||||||
|
info.name, info.keyPair, info.completeEnvironment,
|
||||||
|
callback
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
signUpChain.addCallback(new CallbackWithVariables(info) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(Object... arguments) {
|
||||||
|
SignUpInfo info = (SignUpInfo)V(0);
|
||||||
|
info.callback.invoke(arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
main.eventPropagator.signal(
|
||||||
|
EventPropagator.INVOKE,
|
||||||
|
signUpChain
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
protected void signUp_step_requestAccess (SignUpInfo info, Callback callback)
|
||||||
|
{
|
||||||
|
if (info.storage == SignUpInfo.Storage.Mailiverse)
|
||||||
|
signUp_step_requestMailiverseBucket(info, callback);
|
||||||
|
else
|
||||||
|
if (info.storage == SignUpInfo.Storage.Dropbox)
|
||||||
|
signUp_step_requestDropboxAccessToken(info, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void signUp_step_requestMailiverseBucket (SignUpInfo info, Callback callback)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestMailiverseBucket");
|
||||||
|
|
||||||
|
String url =
|
||||||
|
ConstantsClient.WEB_SERVER_TOMCAT + "CreateBucket" +
|
||||||
|
"?email=" + info.name + "&captcha=" + info.captchaToken + "®ion=" + info.storageRegion;
|
||||||
|
|
||||||
|
JSHttpDelegate http = new JSHttpDelegate(main.delegate);
|
||||||
|
http.execute(HttpDelegate.GET, url, null, false, false, null,
|
||||||
|
new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestMailiverseBucket callback");
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
String response = (String)arguments[0];
|
||||||
|
String awsBucketName=null, awsBucketRegion=null,
|
||||||
|
awsWriteAccessKey=null, awsWriteSecretKey=null,
|
||||||
|
awsReadWriteAccessKey=null, awsReadWriteSecretKey=null;
|
||||||
|
|
||||||
|
String[] parts = response.split("&");
|
||||||
|
for (String part : parts)
|
||||||
|
{
|
||||||
|
String[] keyValue = part.split("!");
|
||||||
|
String key = keyValue[0];
|
||||||
|
String value = keyValue[1];
|
||||||
|
|
||||||
|
if (key.equalsIgnoreCase("writeAccessKey"))
|
||||||
|
awsWriteAccessKey = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("writeSecretKey"))
|
||||||
|
awsWriteSecretKey = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("readWriteAccessKey"))
|
||||||
|
awsReadWriteAccessKey = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("readWriteSecretKey"))
|
||||||
|
awsReadWriteSecretKey = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("bucketName"))
|
||||||
|
awsBucketName = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("bucketRegion"))
|
||||||
|
awsBucketRegion = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.setAWSInfo(awsBucketName, awsBucketRegion, awsWriteAccessKey, awsWriteSecretKey, awsReadWriteAccessKey, awsReadWriteSecretKey);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}.setReturn(callback)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void signUp_step_requestDropboxAccessToken (SignUpInfo info, Callback callback)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestAccessToken");
|
||||||
|
|
||||||
|
String url =
|
||||||
|
"https://api.dropbox.com/1/oauth/access_token" +
|
||||||
|
"?oauth_consumer_key=" + info.dropboxAppKey +
|
||||||
|
"&oauth_token=" + info.dropboxAuthToken + "&" +
|
||||||
|
"&oauth_signature_method=PLAINTEXT" +
|
||||||
|
"&oauth_signature=" + info.dropboxAppSecret + "%26" + info.dropboxAuthSecret +
|
||||||
|
"&oauth_nonce=\"" + (new Date()).getTime() + "\"";
|
||||||
|
|
||||||
|
JSHttpDelegate http = new JSHttpDelegate(main.delegate);
|
||||||
|
http.execute(HttpDelegate.GET, url, null, false, false, null,
|
||||||
|
new CallbackDefault(info) {
|
||||||
|
public void onSuccess(Object... arguments)
|
||||||
|
{
|
||||||
|
log.debug("signUp_step_requestAccessToken callback");
|
||||||
|
SignUpInfo info = V(0);
|
||||||
|
|
||||||
|
String response = (String)arguments[0];
|
||||||
|
String token=null, tokenSecret=null;
|
||||||
|
String[] parts = response.split("&");
|
||||||
|
for (String part : parts)
|
||||||
|
{
|
||||||
|
String[] keyValue = part.split("=");
|
||||||
|
String key = keyValue[0];
|
||||||
|
String value = keyValue[1];
|
||||||
|
|
||||||
|
if (key.equalsIgnoreCase("oauth_token_secret"))
|
||||||
|
tokenSecret = value;
|
||||||
|
else
|
||||||
|
if (key.equalsIgnoreCase("oauth_token"))
|
||||||
|
token = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
info.setDropboxInfo(token, tokenSecret);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}.setReturn(callback)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void createUser (String user, KeyPairFromPassword keyPair, String token, Callback callback) throws Exception
|
||||||
|
{
|
||||||
|
String url = ConstantsClient.MAIL_SERVER_WEBSOCKET;
|
||||||
|
|
||||||
|
MailServerAuthenticatorNoThread.create_(
|
||||||
|
user, keyPair, token,
|
||||||
|
new JSStreamSessionWebSocket(url, main.delegate)
|
||||||
|
).setReturn(callback).invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void putServerEnvironment (String user, KeyPairFromPassword keyPair, Environment environment, Callback callback) throws Exception
|
||||||
|
{
|
||||||
|
String url = ConstantsClient.MAIL_SERVER_WEBSOCKET;
|
||||||
|
|
||||||
|
MailServerAuthenticatorNoThread.put_(
|
||||||
|
user, keyPair, environment,
|
||||||
|
new JSStreamSessionWebSocket(url, main.delegate),
|
||||||
|
JSSignUp.this
|
||||||
|
).setReturn(callback).invoke(environment);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void putClientEnvironment (String user, KeyPairFromPassword keyPair, Environment environment, Callback callback)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String url = ConstantsClient.KEY_SERVER_WEBSOCKET;
|
||||||
|
|
||||||
|
KeyServerAuthenticatorNoThread.put_(
|
||||||
|
user, keyPair, environment,
|
||||||
|
new JSStreamSessionWebSocket(url, main.delegate),
|
||||||
|
JSSignUp.this
|
||||||
|
).setReturn(callback).invoke(environment);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
callback.invoke(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSRPStep (String event)
|
||||||
|
{
|
||||||
|
main.eventPropagator.signal("onAuthenticationStep", event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
129
java/app/service/src/app/service/JSStreamSessionWebSocket.java
Normal file
129
java/app/service/src/app/service/JSStreamSessionWebSocket.java
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import core.io.IoChain;
|
||||||
|
import core.io.IoChainFinishedException;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.Strings;
|
||||||
|
|
||||||
|
@Export
|
||||||
|
public class JSStreamSessionWebSocket extends IoChain implements Exportable
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull(JSStreamSessionWebSocket.class);
|
||||||
|
|
||||||
|
boolean isOpen = false;
|
||||||
|
Object delegate;
|
||||||
|
Object socket;
|
||||||
|
List<byte[]> queued = new ArrayList<byte[]>();
|
||||||
|
|
||||||
|
public JSStreamSessionWebSocket(String url, Object delegate)
|
||||||
|
{
|
||||||
|
super(null);
|
||||||
|
|
||||||
|
this.delegate = delegate;
|
||||||
|
|
||||||
|
log.debug("JSStreamSessionWebSocket", url, delegate);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
socket = JSInvoker.invoke(
|
||||||
|
delegate,
|
||||||
|
"socketConstruct",
|
||||||
|
new Object[] {
|
||||||
|
this,
|
||||||
|
url
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// work around a gwt-exporter thing, which I don't feel like fixing now
|
||||||
|
log.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void send(byte[] data) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("send:", data, data != null ? Strings.toString(data) : null);
|
||||||
|
|
||||||
|
if (data != null)
|
||||||
|
queued.add(data);
|
||||||
|
|
||||||
|
if (isOpen)
|
||||||
|
{
|
||||||
|
while (!queued.isEmpty())
|
||||||
|
{
|
||||||
|
byte[] bytes = queued.get(0);
|
||||||
|
queued.remove(0);
|
||||||
|
|
||||||
|
log.debug("sending:", bytes);
|
||||||
|
JSInvoker.invoke(
|
||||||
|
delegate,
|
||||||
|
"socketSend",
|
||||||
|
new Object[] {
|
||||||
|
socket,
|
||||||
|
Strings.toString(bytes)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onMessage (String packet)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
log.debug("onMessage",packet);
|
||||||
|
receive(packet.getBytes());
|
||||||
|
log.debug("after recieve");
|
||||||
|
}
|
||||||
|
catch (Throwable e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEvent (String event) throws Exception
|
||||||
|
{
|
||||||
|
log.debug("onEvent", event);
|
||||||
|
if (event.equals("onOpen"))
|
||||||
|
{
|
||||||
|
isOpen = true;
|
||||||
|
send(null);
|
||||||
|
}
|
||||||
|
if (event.equals("onClose"))
|
||||||
|
{
|
||||||
|
onException(new IoChainFinishedException());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onException (Exception e)
|
||||||
|
{
|
||||||
|
super.onException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close () throws Exception
|
||||||
|
{
|
||||||
|
if (delegate != null)
|
||||||
|
JSInvoker.invoke(
|
||||||
|
delegate,
|
||||||
|
"socketClose",
|
||||||
|
new Object[] {
|
||||||
|
socket
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
88
java/app/service/src/app/service/MailI.java
Normal file
88
java/app/service/src/app/service/MailI.java
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import mail.client.model.Attachments;
|
||||||
|
import mail.client.model.Body;
|
||||||
|
import mail.client.model.Header;
|
||||||
|
import mail.client.model.Identity;
|
||||||
|
import mail.client.model.Mail;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
@Export
|
||||||
|
public class MailI implements Exportable
|
||||||
|
{
|
||||||
|
Mail o;
|
||||||
|
|
||||||
|
public MailI (Mail o)
|
||||||
|
{
|
||||||
|
this.o = o;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Mail deref ()
|
||||||
|
{
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(MailI rhs)
|
||||||
|
{
|
||||||
|
return o == rhs.o || o.equals(rhs.o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Header getHeader()
|
||||||
|
{
|
||||||
|
return o.getHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeader(Header header)
|
||||||
|
{
|
||||||
|
o.setHeader(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Body getBody()
|
||||||
|
{
|
||||||
|
return o.getBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBody(Body body)
|
||||||
|
{
|
||||||
|
o.setBody(body);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBody(String text, String html)
|
||||||
|
{
|
||||||
|
o.setBody(text, html);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Identity[] calculateReplyTo()
|
||||||
|
{
|
||||||
|
return o.calculateReplyTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Body calculateReply(String signature) throws IOException
|
||||||
|
{
|
||||||
|
return o.calculateReply(signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Attachments getAttachments()
|
||||||
|
{
|
||||||
|
return o.getAttachments();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttachments(Attachments attachments)
|
||||||
|
{
|
||||||
|
o.setAttachments(attachments);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isLoaded()
|
||||||
|
{
|
||||||
|
return o.isLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
191
java/app/service/src/app/service/Main.java
Normal file
191
java/app/service/src/app/service/Main.java
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
import org.timepedia.exporter.client.Export;
|
||||||
|
import org.timepedia.exporter.client.Exportable;
|
||||||
|
|
||||||
|
|
||||||
|
import app.service.JSClient;
|
||||||
|
import app.service.JSEventPropagator;
|
||||||
|
import app.service.JSHttpDelegate;
|
||||||
|
import app.service.JSRefill;
|
||||||
|
import app.service.JSResult;
|
||||||
|
import app.service.JSSignUp;
|
||||||
|
import app.service.JSStreamSessionWebSocket;
|
||||||
|
|
||||||
|
import mail.client.Client;
|
||||||
|
import mail.client.Events;
|
||||||
|
|
||||||
|
import core.callback.Callback;
|
||||||
|
import core.callback.CallbackChain;
|
||||||
|
import core.callback.CallbackDefault;
|
||||||
|
import core.constants.ConstantsClient;
|
||||||
|
import core.crypt.KeyPairFromPassword;
|
||||||
|
import core.srp.client.SRPClientListener;
|
||||||
|
import core.util.Environment;
|
||||||
|
import core.util.LogNull;
|
||||||
|
import core.util.LogOut;
|
||||||
|
import key.auth.KeyServerAuthenticatorNoThread;
|
||||||
|
|
||||||
|
@Export()
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class Main extends JSApplet implements Exportable, SRPClientListener
|
||||||
|
{
|
||||||
|
static LogNull log = new LogNull (Main.class);
|
||||||
|
|
||||||
|
static String VERSION_STRING = "M";
|
||||||
|
|
||||||
|
Object delegate;
|
||||||
|
JSEventPropagator eventPropagator;
|
||||||
|
|
||||||
|
public Main ()
|
||||||
|
{
|
||||||
|
eventPropagator = new JSEventPropagator();
|
||||||
|
eventPropagator.signal ("Loaded");
|
||||||
|
|
||||||
|
eventPropagator.add(
|
||||||
|
"Loaded", null,
|
||||||
|
new CallbackDefault () {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception
|
||||||
|
{
|
||||||
|
Object window = getWindow(this);
|
||||||
|
JSInvoker.invoke(window, "onMailiverseServiceLoaded", null);
|
||||||
|
}}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#setDelegate(java.lang.Object)
|
||||||
|
*/
|
||||||
|
public void setDelegate (Object delegate)
|
||||||
|
{
|
||||||
|
log.debug("setDelegate");
|
||||||
|
this.delegate = delegate;
|
||||||
|
eventPropagator.setDelegate(delegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#garbageCollect()
|
||||||
|
*/
|
||||||
|
public void garbageCollect ()
|
||||||
|
{
|
||||||
|
System.gc();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#dispatchEvents()
|
||||||
|
*/
|
||||||
|
public void dispatchEvents ()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
eventPropagator.dispatchEvents();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.exception(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#getSignUp()
|
||||||
|
*/
|
||||||
|
public JSSignUp getSignUp ()
|
||||||
|
{
|
||||||
|
return new JSSignUp(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#getRefill()
|
||||||
|
*/
|
||||||
|
public JSRefill getRefill ()
|
||||||
|
{
|
||||||
|
return new JSRefill(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSDelete getDelete ()
|
||||||
|
{
|
||||||
|
return new JSDelete(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see app.service.MainInterface#authenticate(java.lang.String, java.lang.String)
|
||||||
|
*/
|
||||||
|
public void authenticate (String user, String password)
|
||||||
|
{
|
||||||
|
authenticate_(user, password).invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback authenticate_ (String user, String password)
|
||||||
|
{
|
||||||
|
KeyPairFromPassword keyPair = new KeyPairFromPassword(password);
|
||||||
|
CallbackChain chain = new CallbackChain();
|
||||||
|
return chain
|
||||||
|
.addCallback(keyPair.generate_())
|
||||||
|
.addCallback(io_(user))
|
||||||
|
.addCallback(start_(user))
|
||||||
|
.addCallback(propagate_());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback io_ (String user)
|
||||||
|
{
|
||||||
|
return new CallbackDefault(user) {
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
String user = V(0);
|
||||||
|
KeyPairFromPassword keyPair = (KeyPairFromPassword)arguments[0];
|
||||||
|
|
||||||
|
KeyServerAuthenticatorNoThread.get_(
|
||||||
|
user, keyPair,
|
||||||
|
new JSStreamSessionWebSocket(ConstantsClient.KEY_SERVER_WEBSOCKET, delegate),
|
||||||
|
Main.this
|
||||||
|
).setReturn(callback).invoke();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSRPStep (String event)
|
||||||
|
{
|
||||||
|
eventPropagator.signal("onAuthenticationStep", event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback start_ (String user)
|
||||||
|
{
|
||||||
|
return new CallbackDefault(user) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Object... arguments) throws Exception {
|
||||||
|
String user = V(0);
|
||||||
|
Environment env = (Environment)arguments[0];
|
||||||
|
|
||||||
|
JSClient client = new JSClient(
|
||||||
|
Client.start(
|
||||||
|
env, user,
|
||||||
|
new JSHttpDelegate(delegate),
|
||||||
|
eventPropagator
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
callback.invoke(client);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Callback propagate_()
|
||||||
|
{
|
||||||
|
return new Callback () {
|
||||||
|
|
||||||
|
public void invoke(Object...arguments)
|
||||||
|
{
|
||||||
|
JSResult<Client> result = new JSResult<Client>();
|
||||||
|
result.invoke(arguments[0]);
|
||||||
|
eventPropagator.signal(Events.Login, result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
13
java/app/service/src/app/service/ServiceAppletRunnable.java
Normal file
13
java/app/service/src/app/service/ServiceAppletRunnable.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Author: Timothy Prepscius
|
||||||
|
* License: GPLv3 Affero + keep my name in the code!
|
||||||
|
*/
|
||||||
|
package app.service;
|
||||||
|
|
||||||
|
public class ServiceAppletRunnable
|
||||||
|
{
|
||||||
|
public static void main (String[] args) throws Exception
|
||||||
|
{
|
||||||
|
Main main = new Main();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user