2008-01-11 03:37:18 +00:00
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
BACKEND_URL = 'https://www-test.allmydata.com/native_client2.php'
|
|
|
|
REGISTER_PAGE = 'https://www-test.allmydata.com/register'
|
|
|
|
WINSVC_NAME = 'Tahoe'
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import traceback
|
2008-01-11 03:37:18 +00:00
|
|
|
import urllib2
|
|
|
|
from urllib import urlencode
|
2008-01-12 02:53:15 +00:00
|
|
|
import webbrowser
|
|
|
|
import wx
|
2008-01-11 03:37:18 +00:00
|
|
|
|
|
|
|
from allmydata.util.assertutil import precondition
|
|
|
|
from allmydata import uri
|
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
import amdicon
|
|
|
|
|
|
|
|
|
2008-01-11 03:37:18 +00:00
|
|
|
class AuthError(Exception):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def unicode_to_utf8(uobj):
|
|
|
|
assert precondition(isinstance(uobj, unicode))
|
|
|
|
return uobj.encode('utf-8')
|
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
|
2008-01-11 03:37:18 +00:00
|
|
|
def post(url, args):
|
|
|
|
argstr = urlencode(args)
|
|
|
|
conn = urllib2.urlopen(url, argstr)
|
|
|
|
return conn.read()
|
|
|
|
|
|
|
|
def get_root_cap(url, user, passwd):
|
|
|
|
args = {
|
|
|
|
'action': 'authenticate',
|
|
|
|
'email': unicode_to_utf8(user),
|
|
|
|
'passwd': unicode_to_utf8(passwd),
|
|
|
|
}
|
|
|
|
root_cap = post(url, args)
|
|
|
|
if root_cap == '0':
|
|
|
|
raise AuthError()
|
|
|
|
elif not uri.is_uri(root_cap):
|
|
|
|
raise ValueError('%r is not a URI' % (root_cap,))
|
|
|
|
else:
|
|
|
|
return root_cap
|
|
|
|
|
|
|
|
def get_introducer_furl(url):
|
|
|
|
return post(url, { 'action': 'getintroducerfurl' })
|
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
def write_config_file(filename, contents):
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
from allmydata.windows import registry
|
|
|
|
basedir = registry.get_base_dir_path()
|
|
|
|
else:
|
|
|
|
basedir = os.path.expanduser('~/.tahoe')
|
|
|
|
path = os.path.join(basedir, filename)
|
|
|
|
dirname = os.path.dirname(path)
|
|
|
|
if not os.path.exists(dirname):
|
|
|
|
os.makedirs(dirname)
|
|
|
|
iff = file(path, 'wb')
|
|
|
|
iff.write(contents)
|
|
|
|
iff.close()
|
|
|
|
|
|
|
|
|
|
|
|
def DisplayTraceback(message):
|
|
|
|
xc = traceback.format_exception(*sys.exc_info())
|
|
|
|
wx.MessageBox(u"%s\n (%s)"%(message,''.join(xc)), 'Error')
|
|
|
|
|
|
|
|
class ConfWizApp(wx.App):
|
|
|
|
def __init__(self):
|
|
|
|
wx.App.__init__(self, 0)
|
|
|
|
|
|
|
|
def OnInit(self):
|
|
|
|
try:
|
|
|
|
wx.InitAllImageHandlers()
|
|
|
|
|
|
|
|
self.frame = ConfWizFrame(self)
|
|
|
|
self.frame.CenterOnScreen()
|
|
|
|
self.SetTopWindow(self.frame)
|
|
|
|
self.SetExitOnFrameDelete(True)
|
|
|
|
self.frame.Show(True)
|
|
|
|
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
DisplayTraceback('config wizard init threw an exception')
|
|
|
|
|
|
|
|
class ConfWizFrame(wx.Frame):
|
|
|
|
def __init__(self, app):
|
|
|
|
title = 'Allmydata Tahoe Config Wizard'
|
|
|
|
wx.Frame.__init__(self, None, -1, title)
|
|
|
|
self.app = app
|
|
|
|
self.SetSizeHints(100, 100, 600, 800)
|
|
|
|
self.SetIcon(amdicon.getIcon())
|
|
|
|
self.Bind(wx.EVT_CLOSE, self.close)
|
|
|
|
|
|
|
|
background = wx.Panel(self, -1)
|
|
|
|
background.parent = self
|
|
|
|
self.login_panel = LoginPanel(background)
|
|
|
|
self.register_panel = RegisterPanel(background)
|
|
|
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
background_sizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
background_sizer.Add(self.login_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
|
|
|
|
background_sizer.Add(self.register_panel, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
|
|
|
|
background.SetSizer(background_sizer)
|
|
|
|
sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
|
|
|
|
self.SetSizer(sizer)
|
|
|
|
self.SetAutoLayout(True)
|
|
|
|
self.Fit()
|
|
|
|
self.Layout()
|
|
|
|
|
|
|
|
def close(self, event):
|
|
|
|
sys.exit()
|
2008-01-11 03:37:18 +00:00
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
class LoginPanel(wx.Panel):
|
|
|
|
def __init__(self, parent):
|
|
|
|
wx.Panel.__init__(self, parent, -1)
|
|
|
|
self.parent = parent
|
2008-01-11 03:37:18 +00:00
|
|
|
|
2008-01-12 02:53:15 +00:00
|
|
|
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
|
|
|
|
self.user_label = wx.StaticText(self, -1, 'Email')
|
|
|
|
self.pass_label = wx.StaticText(self, -1, 'Password')
|
|
|
|
self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1))
|
|
|
|
self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
|
|
|
|
self.login_button = wx.Button(self, -1, 'Sign In')
|
|
|
|
self.warning_label = wx.StaticText(self, -1, '')
|
|
|
|
self.warning_label.SetOwnForegroundColour(wx.RED)
|
|
|
|
wx.EVT_CHAR(self.user_field, self.on_user_entry)
|
|
|
|
wx.EVT_CHAR(self.pass_field, self.on_pass_entry)
|
|
|
|
self.Bind(wx.EVT_BUTTON, self.on_login, self.login_button)
|
|
|
|
login_sizer = wx.FlexGridSizer(3, 2, 5, 4)
|
|
|
|
login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2)
|
|
|
|
login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2)
|
|
|
|
login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
login_sizer.Add(self.login_button, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
self.sizer.Add(login_sizer, 1, wx.EXPAND | wx.ALL, 2)
|
|
|
|
#self.sizer.Add(self.warning_label, 0, wx.EXPAND | wx.ALL, 2)
|
|
|
|
self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
|
|
|
|
self.SetSizer(self.sizer)
|
|
|
|
self.SetAutoLayout(True)
|
|
|
|
|
|
|
|
def on_user_entry(self, event):
|
|
|
|
if event.GetKeyCode() == wx.WXK_RETURN:
|
|
|
|
self.pass_field.SetFocus()
|
|
|
|
else:
|
|
|
|
event.Skip()
|
|
|
|
|
|
|
|
def on_pass_entry(self, event):
|
|
|
|
if event.GetKeyCode() == wx.WXK_RETURN:
|
|
|
|
self.on_login(event)
|
|
|
|
else:
|
|
|
|
event.Skip()
|
|
|
|
|
|
|
|
def on_login(self, event):
|
|
|
|
user = self.user_field.GetValue()
|
|
|
|
passwd = self.pass_field.GetValue()
|
|
|
|
self.warning_label.SetLabel('')
|
|
|
|
|
|
|
|
try:
|
|
|
|
root_cap = get_root_cap(BACKEND_URL, user, passwd)
|
|
|
|
write_config_file('private/root_dir.cap', root_cap+'\n')
|
|
|
|
except AuthError:
|
|
|
|
self.warning_label.SetLabel('Your email and/or password is incorrect')
|
|
|
|
self.user_field.SetFocus()
|
|
|
|
self.Layout()
|
|
|
|
return
|
|
|
|
|
|
|
|
# fetch the introducer furl
|
|
|
|
ifurl = get_introducer_furl(BACKEND_URL)
|
|
|
|
write_config_file('introducer.furl', ifurl+'\n')
|
|
|
|
|
|
|
|
# start service etc.
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
try:
|
|
|
|
import win32service
|
|
|
|
import win32serviceutil as wsu
|
|
|
|
if wsu.QueryServiceStatus(WINSVC_NAME)[1] != win32service.SERVICE_RUNNING:
|
|
|
|
wsu.StartService(WINSVC_NAME)
|
|
|
|
except:
|
|
|
|
DisplayTraceback('Failed to start windows service')
|
|
|
|
|
|
|
|
# exit
|
|
|
|
self.parent.parent.Close()
|
|
|
|
|
|
|
|
class RegisterPanel(wx.Panel):
|
|
|
|
def __init__(self, parent):
|
|
|
|
wx.Panel.__init__(self, parent, -1)
|
|
|
|
self.parent = parent
|
|
|
|
|
|
|
|
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
|
|
|
|
self.reg_label = wx.StaticText(self, -1, "Don't have an account?")
|
|
|
|
self.reg_button = wx.Button(self, -1, 'Create Account')
|
|
|
|
self.Bind(wx.EVT_BUTTON, self.on_reg_button, self.reg_button)
|
|
|
|
reg_sizer = wx.FlexGridSizer(1, 2, 5, 4)
|
|
|
|
reg_sizer.Add(self.reg_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
reg_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
|
|
|
self.sizer.Add(reg_sizer, 1, wx.EXPAND | wx.ALL, 2)
|
|
|
|
self.SetSizer(self.sizer)
|
|
|
|
self.SetAutoLayout(True)
|
|
|
|
|
|
|
|
def on_reg_button(self, event):
|
|
|
|
webbrowser.open(REGISTER_PAGE)
|
|
|
|
|
|
|
|
def main():
|
|
|
|
app = ConfWizApp()
|
|
|
|
app.MainLoop()
|
2008-01-11 03:37:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|