new account registration wizard that follow XEP 77 better. fixes #2700 too (advanced options available while creation an account)

This commit is contained in:
Yann Leboulanger 2007-05-31 21:49:49 +00:00
parent b11ad2e5ac
commit 0e3c634ff2
5 changed files with 1078 additions and 1361 deletions

File diff suppressed because it is too large Load Diff

View File

@ -206,30 +206,15 @@ class Connection(ConnectionHandlers):
# it's a new account
if not data[1]: # wrong answer
self.dispatch('ACC_NOT_OK', (
_('Transport %s answered wrongly to register request: %s')\
_('Server %s answered wrongly to register request: %s')\
% (data[0], data[3])))
return
req = data[1].asDict()
req['username'] = self.new_account_info['name']
req['password'] = self.new_account_info['password']
def _on_register_result(result):
if not common.xmpp.isResultNode(result):
self.dispatch('ACC_NOT_OK', (result.getError()))
return
self.password = self.new_account_info['password']
if USE_GPG:
self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent'))
gajim.config.set('usegpg', True)
is_form = data[2]
if is_form:
conf = data[1]
else:
gajim.config.set('usegpg', False)
gajim.connections[self.name] = self
self.dispatch('ACC_OK', (self.new_account_info))
self.new_account_info = None
if self.connection:
self.connection.UnregisterDisconnectHandler(self._on_new_account)
self.disconnect(on_purpose=True)
common.xmpp.features_nb.register(self.connection, data[0],
req, _on_register_result)
conf = data[1].asDict()
self.dispatch('NEW_ACC_CONNECTED', (conf, is_form))
return
if not data[1]: # wrong answer
self.dispatch('ERROR', (_('Invalid answer'),
@ -1014,12 +999,46 @@ class Connection(ConnectionHandlers):
self.connection.getRoster().setItem(jid = jid, name = name,
groups = groups)
def send_new_account_infos(self, form, is_form):
def _on_register_result(result):
if not common.xmpp.isResultNode(result):
self.dispatch('ACC_NOT_OK', (result.getError()))
return
if USE_GPG:
self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent'))
gajim.config.set('usegpg', True)
else:
gajim.config.set('usegpg', False)
gajim.connections[self.name] = self
self.dispatch('ACC_OK', (self.new_account_info))
self.new_account_info = None
if self.connection:
self.connection.UnregisterDisconnectHandler(self._on_new_account)
self.disconnect(on_purpose=True)
if is_form:
# Get username and password and put them in new_account_info
for field in self._data_form.iter_fields():
if field.var == 'username':
self.new_account_info['name'] = field.value
if field.var == 'password':
self.new_account_info['password'] = field.value
iq=Iq('set', NS_REGISTER, to = self._hostname)
iq.setTag('query').addChild(node = form)
self.connection.SendAndCallForResponse(iq, _on_register_result)
else:
# Get username and password and put them in new_account_info
if form.has_key('username'):
self.new_account_info['name'] = form['username']
if form.has_key('password'):
self.new_account_info['password'] = form['password']
common.xmpp.features_nb.register(self.connection, self._hostname,
form, _on_register_result)
def new_account(self, name, config, sync = False):
# If a connection already exist we cannot create a new account
if self.connection:
return
self._hostname = config['hostname']
self.server_resource = config['resource']
self.new_account_info = config
self.name = name
self.on_connect_success = self._on_new_account
@ -1028,13 +1047,11 @@ class Connection(ConnectionHandlers):
def _on_new_account(self, con = None, con_type = None):
if not con_type:
self.dispatch('ACC_NOT_OK',
self.dispatch('NEW_ACC_NOT_CONNECTED',
(_('Could not connect to "%s"') % self._hostname))
return
self.on_connect_failure = None
self.connection = con
#if con:
# con.RegisterDisconnectHandler(self._on_new_account)
common.xmpp.features_nb.getRegInfo(con, self._hostname)
def account_changed(self, new_name):

View File

@ -143,7 +143,6 @@ def _ReceivedRegInfo(con, resp, agent):
def register(disp, host, info, cb):
""" Perform registration on remote server with provided info.
disp must be connected dispatcher instance.
Returns true or false depending on registration result.
If registration fails you can get additional info from the dispatcher's owner
attributes lastErrNode, lastErr and lastErrCode.
"""

View File

@ -2097,7 +2097,7 @@ class FakeDataForm(gtk.Table, object):
self._draw_table()
def _draw_table(self):
'''Draw the table in the window'''
'''Draw the table'''
nbrow = 0
if self.infos.has_key('instructions'):
nbrow = 1
@ -2778,13 +2778,21 @@ class AccountCreationWizardWindow:
'account_creation_wizard_window.glade')
self.window = self.xml.get_widget('account_creation_wizard_window')
completion = gtk.EntryCompletion()
# Connect events from comboboxentry.child
server_comboboxentry = self.xml.get_widget('server_comboboxentry')
entry = server_comboboxentry.child
entry.connect('key_press_event',
self.on_server_comboboxentry_key_press_event)
completion = gtk.EntryCompletion()
self.on_server_comboboxentry_key_press_event, server_comboboxentry)
entry.set_completion(completion)
# Do the same for the other server comboboxentry
server_comboboxentry1 = self.xml.get_widget('server_comboboxentry1')
entry = server_comboboxentry1.child
entry.connect('key_press_event',
self.on_server_comboboxentry_key_press_event, server_comboboxentry1)
entry.set_completion(completion)
self.update_proxy_list()
# parse servers.xml
servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml')
@ -2800,6 +2808,8 @@ class AccountCreationWizardWindow:
# Put servers into comboboxentries
server_comboboxentry.set_model(servers_model)
server_comboboxentry.set_text_column(0)
server_comboboxentry1.set_model(servers_model)
server_comboboxentry1.set_text_column(0)
# Generic widgets
self.notebook = self.xml.get_widget('notebook')
@ -2838,28 +2848,18 @@ class AccountCreationWizardWindow:
self.window.destroy()
def on_back_button_clicked(self, widget):
if self.notebook.get_current_page() == 1:
if self.notebook.get_current_page() in (1, 2):
self.notebook.set_current_page(0)
self.back_button.set_sensitive(False)
elif self.notebook.get_current_page() == 3: # finish page
elif self.notebook.get_current_page() == 3:
self.notebook.set_current_page(2)
self.xml.get_widget('form_vbox').remove(self.data_form_widget)
elif self.notebook.get_current_page() == 5: # finish page
self.forward_button.show()
self.notebook.set_current_page(1) # Goto parameters page
def get_widgets(self):
widgets = {}
for widget in (
'username_entry',
'server_comboboxentry',
'pass1_entry',
'pass2_entry',
'save_password_checkbutton',
'proxyhost_entry',
'proxyport_entry',
'proxyuser_entry',
'proxypass_entry',
'jid_label'):
widgets[widget] = self.xml.get_widget(widget)
return widgets
if self.modify:
self.notebook.set_current_page(1) # Go to parameters page
else:
self.notebook.set_current_page(2) # Go to server page
def on_forward_button_clicked(self, widget):
cur_page = self.notebook.get_current_page()
@ -2868,39 +2868,29 @@ class AccountCreationWizardWindow:
widget = self.xml.get_widget('use_existing_account_radiobutton')
if widget.get_active():
self.modify = True
self.xml.get_widget('server_features_button').hide()
self.xml.get_widget('pass2_entry').hide()
self.xml.get_widget('pass2_label').hide()
self.notebook.set_current_page(1)
else:
self.modify = False
self.xml.get_widget('server_features_button').show()
self.xml.get_widget('pass2_entry').show()
self.xml.get_widget('pass2_label').show()
self.notebook.set_current_page(1)
self.notebook.set_current_page(2)
self.back_button.set_sensitive(True)
return
widgets = self.get_widgets()
username = widgets['username_entry'].get_text().decode('utf-8')
elif cur_page == 1:
# We are adding an existing account
username = self.xml.get_widget('username_entry').get_text().decode(
'utf-8')
if not username:
pritext = _('Invalid username')
sectext = _('You must provide a username to configure this account.')
sectext = _(
'You must provide a username to configure this account.')
dialogs.ErrorDialog(pritext, sectext)
return
server = widgets['server_comboboxentry'].child.get_text().decode('utf-8')
savepass = widgets['save_password_checkbutton'].get_active()
password = widgets['pass1_entry'].get_text().decode('utf-8')
if not self.modify:
if password == '':
dialogs.ErrorDialog(_('Invalid password'),
_('You must enter a password for the new account.'))
return
if widgets['pass2_entry'].get_text() != password:
dialogs.ErrorDialog(_('Passwords do not match'),
_('The passwords typed in both fields must be identical.'))
return
server = self.xml.get_widget('server_comboboxentry').child.get_text().\
decode('utf-8')
savepass = self.xml.get_widget('save_password_checkbutton').\
get_active()
password = self.xml.get_widget('password_entry').get_text().decode(
'utf-8')
jid = username + '@' + server
# check if jid is conform to RFC and stringprep it
@ -2947,20 +2937,130 @@ class AccountCreationWizardWindow:
self.go_online_checkbutton.show()
img = self.xml.get_widget('finish_image')
img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG)
self.notebook.set_current_page(3) # show finish page
self.notebook.set_current_page(5) # show finish page
self.show_vcard_checkbutton.set_active(False)
else:
self.notebook.set_current_page(2) # show creating page
elif cur_page == 2:
server = self.xml.get_widget('server_comboboxentry1').child.get_text()\
.decode('utf-8')
if not server:
dialogs.ErrorDialog(_('Invalid server'),
_('Please provide a server on which you want to register.'))
return
self.account = server
i = 1
while self.account in gajim.connections:
self.account = server + str(i)
i += 1
config = self.get_config('', server, '', '')
# Get advanced options
proxies_combobox = self.xml.get_widget('proxies_combobox')
active = proxies_combobox.get_active()
proxy = proxies_combobox.get_model()[active][0].decode('utf-8')
if proxy == _('None'):
proxy = ''
config['proxy'] = proxy
config['use_custom_host'] = self.xml.get_widget(
'custom_host_port_checkbutton').get_active()
custom_port = self.xml.get_widget('custom_port_entry').get_text()
try:
custom_port = int(custom_port)
except:
dialogs.ErrorDialog(_('Invalid entry'),
_('Custom port must be a port number.'))
return
config['custom_port'] = custom_port
config['custom_host'] = self.xml.get_widget(
'custom_host_entry').get_text().decode('utf-8')
self.notebook.set_current_page(4) # show creating page
self.back_button.hide()
self.forward_button.hide()
self.update_progressbar_timeout_id = gobject.timeout_add(100,
self.update_progressbar)
# Get form from serveur
con = connection.Connection(self.account)
con.new_account(self.account, config)
gajim.connections[self.account] = con
elif cur_page == 3:
if self.is_form:
form = self.data_form_widget.data_form
else:
form = self.data_form_widget.get_infos()
gajim.connections[self.account].send_new_account_infos(form,
self.is_form)
self.xml.get_widget('form_vbox').remove(self.data_form_widget)
self.xml.get_widget('progressbar_label').set_markup('<b>Account is being created</b>\n\nPlease wait...')
self.notebook.set_current_page(4) # show creating page
self.back_button.hide()
self.forward_button.hide()
self.update_progressbar_timeout_id = gobject.timeout_add(100,
self.update_progressbar)
def update_proxy_list(self):
proxies_combobox = self.xml.get_widget('proxies_combobox')
model = gtk.ListStore(str)
proxies_combobox.set_model(model)
l = gajim.config.get_per('proxies')
l.insert(0, _('None'))
for i in xrange(len(l)):
model.append([l[i]])
proxies_combobox.set_active(0)
def on_manage_proxies_button_clicked(self, widget):
if gajim.interface.instances.has_key('manage_proxies'):
gajim.interface.instances['manage_proxies'].window.present()
else:
gajim.interface.instances['manage_proxies'] = \
ManageProxiesWindow()
def on_custom_host_port_checkbutton_toggled(self, widget):
self.xml.get_widget('custom_host_hbox').set_sensitive(widget.get_active())
def update_progressbar(self):
self.progressbar.pulse()
return True # loop forever
def new_acc_connected(self, form, is_form):
'''connection to server succeded, present the form to the user'''
if self.update_progressbar_timeout_id is not None:
gobject.source_remove(self.update_progressbar_timeout_id)
self.back_button.show()
self.forward_button.show()
self.notebook.set_current_page(3) # show form page
self.is_form = is_form
if is_form:
dataform = dataforms.ExtendForm(node = form)
self.data_form_widget = dataforms_widget.DataFormWidget(dataform)
else:
self.data_form_widget = FakeDataForm(form)
self.data_form_widget.show_all()
self.xml.get_widget('form_vbox').pack_start(self.data_form_widget)
def new_acc_not_connected(self, reason):
'''Account creation failed: connection to server failed'''
if self.update_progressbar_timeout_id is not None:
gobject.source_remove(self.update_progressbar_timeout_id)
del gajim.connections[self.account]
self.back_button.show()
self.cancel_button.show()
self.go_online_checkbutton.hide()
self.show_vcard_checkbutton.hide()
img = self.xml.get_widget('finish_image')
img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
finish_text = '<big><b>%s</b></big>\n\n%s' % (
_('An error occurred during account creation') , reason)
self.finish_label.set_markup(finish_text)
self.notebook.set_current_page(5) # show finish page
def acc_is_ok(self, config):
'''Account creation succeeded'''
self.create_vars(config)
self.cancel_button.hide()
self.back_button.hide()
self.forward_button.hide()
self.finish_button.show()
self.finish_button.set_property('has-default', True)
self.advanced_button.show()
@ -2976,7 +3076,7 @@ class AccountCreationWizardWindow:
'button, or later by choosing the Accounts menuitem under the Edit '
'menu from the main window.'))
self.finish_label.set_markup(finish_text)
self.notebook.set_current_page(3) # show finish page
self.notebook.set_current_page(5) # show finish page
if self.update_progressbar_timeout_id is not None:
gobject.source_remove(self.update_progressbar_timeout_id)
@ -2987,12 +3087,16 @@ class AccountCreationWizardWindow:
self.cancel_button.show()
self.go_online_checkbutton.hide()
self.show_vcard_checkbutton.hide()
del gajim.connections[self.account]
img = self.xml.get_widget('finish_image')
img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
finish_text = '<big><b>%s</b></big>\n\n%s' % (_('An error occurred during '
'account creation') , reason)
self.finish_label.set_markup(finish_text)
self.notebook.set_current_page(3) # show finish page
self.notebook.set_current_page(5) # show finish page
if self.update_progressbar_timeout_id is not None:
gobject.source_remove(self.update_progressbar_timeout_id)
def on_advanced_button_clicked(self, widget):
gajim.interface.instances[self.account]['account_modification'] = \
@ -3022,12 +3126,11 @@ class AccountCreationWizardWindow:
combobox.child.set_position(-1)
return True
def on_server_comboboxentry_key_press_event(self, widget, event):
def on_server_comboboxentry_key_press_event(self, widget, event, combobox):
# If backspace is pressed in empty field, return to the nick entry field
backspace = event.keyval == gtk.keysyms.BackSpace
combobox = self.xml.get_widget('server_comboboxentry')
empty = len(combobox.get_active_text()) == 0
if backspace and empty:
if backspace and empty and self.modify:
username_entry = self.xml.get_widget('username_entry')
username_entry.grab_focus()
username_entry.set_position(-1)
@ -3045,14 +3148,7 @@ class AccountCreationWizardWindow:
string = '<b>%s@%s</b>' % (name, server)
jid_label.set_label(string)
def save_account(self, login, server, savepass, password):
if self.account in gajim.connections:
dialogs.ErrorDialog(_('Account name is in use'),
_('You already have an account using this name.'))
return
con = connection.Connection(self.account)
con.password = password
def get_config(self, login, server, savepass, password):
config = {}
config['name'] = login
config['hostname'] = server
@ -3072,6 +3168,17 @@ class AccountCreationWizardWindow:
config['keyid'] = ''
config['savegpgpass'] = False
config['gpgpassword'] = ''
return config
def save_account(self, login, server, savepass, password):
if self.account in gajim.connections:
dialogs.ErrorDialog(_('Account name is in use'),
_('You already have an account using this name.'))
return
con = connection.Connection(self.account)
con.password = password
config = self.get_config(login, server, savepass, password)
if not self.modify:
con.new_account(self.account, config)

View File

@ -948,6 +948,17 @@ class Interface:
except AttributeError:
return
def handle_event_new_acc_connected(self, account, array):
#('NEW_ACC_CONNECTED', account, (infos, is_form))
if self.instances.has_key('account_creation_wizard'):
self.instances['account_creation_wizard'].new_acc_connected(array[0],
array[1])
def handle_event_new_acc_not_connected(self, account, array):
#('NEW_ACC_NOT_CONNECTED', account, (reason))
if self.instances.has_key('account_creation_wizard'):
self.instances['account_creation_wizard'].new_acc_not_connected(array)
def handle_event_acc_ok(self, account, array):
#('ACC_OK', account, (config))
if self.instances.has_key('account_creation_wizard'):
@ -2047,6 +2058,8 @@ class Interface:
'AGENT_INFO_ITEMS': self.handle_event_agent_info_items,
'AGENT_INFO_INFO': self.handle_event_agent_info_info,
'QUIT': self.handle_event_quit,
'NEW_ACC_CONNECTED': self.handle_event_new_acc_connected,
'NEW_ACC_NOT_CONNECTED': self.handle_event_new_acc_not_connected,
'ACC_OK': self.handle_event_acc_ok,
'ACC_NOT_OK': self.handle_event_acc_not_ok,
'MYVCARD': self.handle_event_myvcard,