mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-22 02:16:42 +00:00
update confwiz to include account creation ui
this changes the confwiz so that hitting the 'create account' button, rather than opening a webbrowser to the register page, instead provides a simple account creation ui directly, along with changes to the backend (native_client.php) to support that. also added a 'connecting...' message so the user sees a response when they hit login or create account, since the getBasedir call can sometimes take up to ~5min (which is unacceptable for a user product, but this at least somewhat ameliorates the issue of the ui locking up and not giving the user any feedback while it's happening)
This commit is contained in:
parent
b1152860cd
commit
fc91837f69
@ -1,15 +1,16 @@
|
|||||||
|
|
||||||
BACKEND_URL = 'https://www-test.allmydata.com/native_client2.php'
|
BACKEND_URL = 'https://www-test.allmydata.com/native_client.php'
|
||||||
REGISTER_PAGE = 'https://www-test.allmydata.com/register'
|
#REGISTER_PAGE = 'https://www-test.allmydata.com/register'
|
||||||
TAHOESVC_NAME = 'Tahoe'
|
TAHOESVC_NAME = 'Tahoe'
|
||||||
WINFUSESVC_NAME = 'Allmydata Tahoe SMB'
|
WINFUSESVC_NAME = 'Allmydata Tahoe SMB'
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
#import time
|
||||||
import traceback
|
import traceback
|
||||||
import urllib2
|
import urllib2
|
||||||
from urllib import urlencode
|
from urllib import urlencode
|
||||||
import webbrowser
|
#import webbrowser
|
||||||
import wx
|
import wx
|
||||||
|
|
||||||
from allmydata.util.assertutil import precondition
|
from allmydata.util.assertutil import precondition
|
||||||
@ -45,6 +46,16 @@ def get_root_cap(url, user, passwd):
|
|||||||
else:
|
else:
|
||||||
return root_cap
|
return root_cap
|
||||||
|
|
||||||
|
def create_account(url, user, passwd, subscribe):
|
||||||
|
args = {
|
||||||
|
'action': 'create_account',
|
||||||
|
'email': unicode_to_utf8(user),
|
||||||
|
'passwd': unicode_to_utf8(passwd),
|
||||||
|
'subscribe': subscribe and 'true' or 'false',
|
||||||
|
}
|
||||||
|
result_code = post(url, args)
|
||||||
|
return result_code
|
||||||
|
|
||||||
def get_introducer_furl(url):
|
def get_introducer_furl(url):
|
||||||
return post(url, { 'action': 'getintroducerfurl' })
|
return post(url, { 'action': 'getintroducerfurl' })
|
||||||
|
|
||||||
@ -75,17 +86,28 @@ class ConfWizApp(wx.App):
|
|||||||
try:
|
try:
|
||||||
wx.InitAllImageHandlers()
|
wx.InitAllImageHandlers()
|
||||||
|
|
||||||
self.frame = ConfWizFrame(self)
|
self.login_frame = LoginFrame(self)
|
||||||
self.frame.CenterOnScreen()
|
self.login_frame.CenterOnScreen()
|
||||||
self.SetTopWindow(self.frame)
|
self.SetTopWindow(self.login_frame)
|
||||||
self.SetExitOnFrameDelete(True)
|
self.SetExitOnFrameDelete(True)
|
||||||
self.frame.Show(True)
|
self.login_frame.Show(True)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
DisplayTraceback('config wizard init threw an exception')
|
DisplayTraceback('config wizard init threw an exception')
|
||||||
|
|
||||||
class ConfWizFrame(wx.Frame):
|
def swap_to_register_frame(self):
|
||||||
|
try:
|
||||||
|
self.login_frame.Show(False)
|
||||||
|
self.regiser_frame = RegisterFrame(self)
|
||||||
|
self.regiser_frame.CenterOnScreen()
|
||||||
|
self.SetTopWindow(self.regiser_frame)
|
||||||
|
self.SetExitOnFrameDelete(True)
|
||||||
|
self.regiser_frame.Show(True)
|
||||||
|
except:
|
||||||
|
DisplayTraceback('config wizard threw an exception')
|
||||||
|
|
||||||
|
class LoginFrame(wx.Frame):
|
||||||
def __init__(self, app):
|
def __init__(self, app):
|
||||||
title = 'Allmydata Tahoe Config Wizard'
|
title = 'Allmydata Tahoe Config Wizard'
|
||||||
wx.Frame.__init__(self, None, -1, title)
|
wx.Frame.__init__(self, None, -1, title)
|
||||||
@ -97,10 +119,35 @@ class ConfWizFrame(wx.Frame):
|
|||||||
background = wx.Panel(self, -1)
|
background = wx.Panel(self, -1)
|
||||||
background.parent = self
|
background.parent = self
|
||||||
self.login_panel = LoginPanel(background)
|
self.login_panel = LoginPanel(background)
|
||||||
self.register_panel = RegisterPanel(background)
|
self.reg_btn_panel = RegisterButtonPanel(background, app)
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
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.login_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
|
||||||
|
background_sizer.Add(self.reg_btn_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()
|
||||||
|
|
||||||
|
class RegisterFrame(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.register_panel = RegisterPanel(background)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
background_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
background_sizer.Add(self.register_panel, 0, 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)
|
background.SetSizer(background_sizer)
|
||||||
sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
|
sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
|
||||||
@ -112,6 +159,7 @@ class ConfWizFrame(wx.Frame):
|
|||||||
def close(self, event):
|
def close(self, event):
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
class LoginPanel(wx.Panel):
|
class LoginPanel(wx.Panel):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wx.Panel.__init__(self, parent, -1)
|
wx.Panel.__init__(self, parent, -1)
|
||||||
@ -137,7 +185,6 @@ class LoginPanel(wx.Panel):
|
|||||||
login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | 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)
|
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(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.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
|
||||||
self.SetSizer(self.sizer)
|
self.SetSizer(self.sizer)
|
||||||
self.SetAutoLayout(True)
|
self.SetAutoLayout(True)
|
||||||
@ -157,7 +204,15 @@ class LoginPanel(wx.Panel):
|
|||||||
def on_login(self, event):
|
def on_login(self, event):
|
||||||
user = self.user_field.GetValue()
|
user = self.user_field.GetValue()
|
||||||
passwd = self.pass_field.GetValue()
|
passwd = self.pass_field.GetValue()
|
||||||
self.warning_label.SetLabel('')
|
self.warning_label.SetLabel('Connecting...')
|
||||||
|
self.Layout()
|
||||||
|
wx.Yield()
|
||||||
|
|
||||||
|
if passwd == '':
|
||||||
|
self.warning_label.SetLabel('You must enter a password')
|
||||||
|
self.pass_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
root_cap = get_root_cap(BACKEND_URL, user, passwd)
|
root_cap = get_root_cap(BACKEND_URL, user, passwd)
|
||||||
@ -189,10 +244,11 @@ class LoginPanel(wx.Panel):
|
|||||||
except:
|
except:
|
||||||
DisplayTraceback('Failed to start windows service "%s"' % (svc_name,))
|
DisplayTraceback('Failed to start windows service "%s"' % (svc_name,))
|
||||||
|
|
||||||
class RegisterPanel(wx.Panel):
|
class RegisterButtonPanel(wx.Panel):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent, app):
|
||||||
wx.Panel.__init__(self, parent, -1)
|
wx.Panel.__init__(self, parent, -1)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
self.app = app
|
||||||
|
|
||||||
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
@ -207,7 +263,138 @@ class RegisterPanel(wx.Panel):
|
|||||||
self.SetAutoLayout(True)
|
self.SetAutoLayout(True)
|
||||||
|
|
||||||
def on_reg_button(self, event):
|
def on_reg_button(self, event):
|
||||||
webbrowser.open(REGISTER_PAGE)
|
#webbrowser.open(REGISTER_PAGE)
|
||||||
|
self.app.swap_to_register_frame()
|
||||||
|
|
||||||
|
class RegisterPanel(wx.Panel):
|
||||||
|
def __init__(self, parent):
|
||||||
|
wx.Panel.__init__(self, parent, -1)
|
||||||
|
self.parent = parent
|
||||||
|
|
||||||
|
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
|
||||||
|
self.user_label = wx.StaticText(self, -1, 'Email')
|
||||||
|
self.pass_label = wx.StaticText(self, -1, 'Password')
|
||||||
|
self.conf_label = wx.StaticText(self, -1, 'Confirm 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.conf_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
|
||||||
|
self.create_account_button = wx.Button(self, -1, 'Create Account')
|
||||||
|
self.subscribe_box = wx.CheckBox(self, -1, 'Sign up for our Newsletter')
|
||||||
|
self.subscribe_box.SetValue(True)
|
||||||
|
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)
|
||||||
|
wx.EVT_CHAR(self.conf_field, self.on_conf_entry)
|
||||||
|
self.Bind(wx.EVT_BUTTON, self.on_create_account, self.create_account_button)
|
||||||
|
login_sizer = wx.FlexGridSizer(4, 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(self.conf_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
|
||||||
|
login_sizer.Add(self.conf_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.create_account_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.CENTER | wx.ALL, 2)
|
||||||
|
self.sizer.Add(self.subscribe_box, 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.conf_field.SetFocus()
|
||||||
|
else:
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
|
def on_conf_entry(self, event):
|
||||||
|
if event.GetKeyCode() == wx.WXK_RETURN:
|
||||||
|
self.on_create_account(event)
|
||||||
|
else:
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
|
def on_create_account(self, event):
|
||||||
|
user = self.user_field.GetValue()
|
||||||
|
passwd = self.pass_field.GetValue()
|
||||||
|
pconf = self.conf_field.GetValue()
|
||||||
|
subscribe = self.subscribe_box.IsChecked()
|
||||||
|
self.warning_label.SetLabel('Connecting...')
|
||||||
|
self.Layout()
|
||||||
|
wx.Yield()
|
||||||
|
|
||||||
|
if passwd == '':
|
||||||
|
self.warning_label.SetLabel('You must enter a password')
|
||||||
|
self.pass_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
|
||||||
|
if passwd != pconf:
|
||||||
|
self.warning_label.SetLabel("Passwords don't match")
|
||||||
|
self.pass_field.SetValue('')
|
||||||
|
self.conf_field.SetValue('')
|
||||||
|
self.pass_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
|
||||||
|
#print 'calling create_account', time.asctime()
|
||||||
|
result_code = create_account(BACKEND_URL, user, passwd, subscribe)
|
||||||
|
|
||||||
|
if result_code == 'account_exists':
|
||||||
|
# try and log into it; if valid, use it anyway
|
||||||
|
try:
|
||||||
|
#print 'calling get_root_cap (ae)', time.asctime()
|
||||||
|
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('That email address is already registered')
|
||||||
|
self.user_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
elif result_code == 'error':
|
||||||
|
self.warning_label.SetLabel('an error occurred')
|
||||||
|
self.user_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
elif result_code == 'ok':
|
||||||
|
#print 'calling get_root_cap (ok)', time.asctime()
|
||||||
|
root_cap = get_root_cap(BACKEND_URL, user, passwd)
|
||||||
|
write_config_file('private/root_dir.cap', root_cap+'\n')
|
||||||
|
else:
|
||||||
|
self.warning_label.SetLabel('an unexpected error occurred ("%s")' % (result_code,))
|
||||||
|
self.user_field.SetFocus()
|
||||||
|
self.Layout()
|
||||||
|
return
|
||||||
|
|
||||||
|
# fetch the introducer furl
|
||||||
|
#print 'calling get_introducer_furl', time.asctime()
|
||||||
|
ifurl = get_introducer_furl(BACKEND_URL)
|
||||||
|
write_config_file('introducer.furl', ifurl+'\n')
|
||||||
|
|
||||||
|
# start service etc.
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
self.start_windows_service(TAHOESVC_NAME)
|
||||||
|
self.start_windows_service(WINFUSESVC_NAME)
|
||||||
|
|
||||||
|
# exit
|
||||||
|
self.parent.parent.Close()
|
||||||
|
|
||||||
|
def start_windows_service(self, svc_name):
|
||||||
|
try:
|
||||||
|
import win32service
|
||||||
|
import win32serviceutil as wsu
|
||||||
|
if wsu.QueryServiceStatus(svc_name)[1] != win32service.SERVICE_RUNNING:
|
||||||
|
wsu.StartService(svc_name)
|
||||||
|
except:
|
||||||
|
DisplayTraceback('Failed to start windows service "%s"' % (svc_name,))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app = ConfWizApp()
|
app = ConfWizApp()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user