func (c *cliUI) enroll(conf *config.ApplicationConfig, currentConf *config.Account) bool { var err error c.warn("Enrolling new config file") var domain string for { c.term.SetPrompt("Account (i.e. [email protected], enter to quit): ") if currentConf.Account, err = c.term.ReadLine(); err != nil || len(currentConf.Account) == 0 { return false } parts := strings.SplitN(currentConf.Account, "@", 2) if len(parts) != 2 { c.alert("invalid username (want user@domain): " + currentConf.Account) continue } domain = parts[1] break } c.term.SetPrompt("Enable debug logging to /tmp/xmpp-client-debug.log? ") if debugLog, err := c.term.ReadLine(); err != nil || !config.ParseYes(debugLog) { c.info("Not enabling debug logging...") } else { c.info("Debug logging enabled...") conf.RawLogFile = "/tmp/xmpp-client-debug.log" } c.term.SetPrompt("Use Tor?: ") if useTorQuery, err := c.term.ReadLine(); err != nil || len(useTorQuery) == 0 || !config.ParseYes(useTorQuery) { c.info("Not using Tor...") currentConf.Proxies = []string{} } else { c.info("Using Tor...") } c.term.SetPrompt("File to import libotr private key from (enter to generate): ") var pkeys []otr3.PrivateKey for { importFile, err := c.term.ReadLine() if err != nil { return false } if len(importFile) > 0 { privKeyBytes, err := ioutil.ReadFile(importFile) if err != nil { c.alert("Failed to open private key file: " + err.Error()) continue } var priv otr3.DSAPrivateKey if !priv.Import(privKeyBytes) { c.alert("Failed to parse libotr private key file (the parser is pretty simple I'm afraid)") continue } pkeys = append(pkeys, &priv) break } else { c.info("Generating private key...") pkeys, err = otr3.GenerateMissingKeys([][]byte{}) if err != nil { c.alert("Failed to generate private key - this implies something is really bad with your system, so we bail out now") return false } break } } currentConf.PrivateKeys = config.SerializedKeys(pkeys) currentConf.OTRAutoAppendTag = true currentConf.OTRAutoStartSession = true currentConf.OTRAutoTearDown = false // Force Tor for servers with well known Tor hidden services. if _, ok := servers.Get(domain); ok && currentConf.HasTorAuto() { const torProxyURL = "socks5://127.0.0.1:9050" c.info("It appears that you are using a well known server and we will use its Tor hidden service to connect.") currentConf.Proxies = []string{torProxyURL} c.term.SetPrompt("> ") return true } var proxyStr string proxyDefaultPrompt := ", enter for none" if currentConf.HasTorAuto() { proxyDefaultPrompt = ", which is the default" } c.term.SetPrompt("Proxy (i.e socks5://127.0.0.1:9050" + proxyDefaultPrompt + "): ") for { if proxyStr, err = c.term.ReadLine(); err != nil { return false } if len(proxyStr) == 0 { if !currentConf.HasTorAuto() { break } else { proxyStr = "socks5://127.0.0.1:9050" } } u, err := url.Parse(proxyStr) if err != nil { c.alert("Failed to parse " + proxyStr + " as a URL: " + err.Error()) continue } if _, err = proxy.FromURL(u, proxy.Direct); err != nil { c.alert("Failed to parse " + proxyStr + " as a proxy: " + err.Error()) continue } break } c.term.SetPrompt("> ") return true }
func (u *gtkUI) accountDialog(s access.Session, account *config.Account, saveFunction func()) { data := getBuilderAndAccountDialogDetails() data.otherSettings.SetActive(u.config.AdvancedOptions) data.acc.SetText(account.Account) data.server.SetText(account.Server) if account.Port == 0 { account.Port = 5222 } data.port.SetText(strconv.Itoa(account.Port)) for _, px := range account.Proxies { iter := data.proxies.Append() data.proxies.SetValue(iter, 0, net.ParseProxy(px).ForPresentation()) data.proxies.SetValue(iter, 1, px) } data.fingerprintsMessage.SetSelectable(true) m := i18n.Local("Your fingerprints for %s:\n%s") message := fmt.Sprintf(m, account.Account, formattedFingerprintsFor(s)) data.fingerprintsMessage.SetText(message) p2, _ := data.notebook.GetNthPage(1) p3, _ := data.notebook.GetNthPage(2) p4, _ := data.notebook.GetNthPage(3) failures := 0 editProxy := func(iter *gtk.TreeIter, onCancel func()) { val, _ := data.proxies.GetValue(iter, 1) realProxyData, _ := val.GetString() u.editProxy(realProxyData, data.dialog, func(p net.Proxy) { data.proxies.SetValue(iter, 0, p.ForPresentation()) data.proxies.SetValue(iter, 1, p.ForProcessing()) }, onCancel) } data.builder.ConnectSignals(map[string]interface{}{ "on_toggle_other_settings": func() { otherSettings := data.otherSettings.GetActive() u.setShowAdvancedSettings(otherSettings) data.notebook.SetShowTabs(otherSettings) if otherSettings { p2.Show() p3.Show() p4.Show() } else { p2.Hide() p3.Hide() p4.Hide() } }, "on_save_signal": func() { accTxt, _ := data.acc.GetText() passTxt, _ := data.pass.GetText() servTxt, _ := data.server.GetText() portTxt, _ := data.port.GetText() isJid, err := verifyXmppAddress(accTxt) if !isJid && failures > 0 { failures++ return } if !isJid { notification := buildBadUsernameNotification(err) data.notificationArea.Add(notification) notification.ShowAll() failures++ log.Printf(err) return } account.Account = accTxt account.Server = servTxt if passTxt != "" { account.Password = passTxt } convertedPort, e := strconv.Atoi(portTxt) if len(strings.TrimSpace(portTxt)) == 0 || e != nil { convertedPort = 5222 } account.Port = convertedPort newProxies := []string{} iter, ok := data.proxies.GetIterFirst() for ok { vv, _ := data.proxies.GetValue(iter, 1) newProxy, _ := vv.GetString() newProxies = append(newProxies, newProxy) ok = data.proxies.IterNext(iter) } account.Proxies = newProxies go saveFunction() data.dialog.Destroy() }, "on_edit_proxy_signal": func() { ts, _ := data.proxiesView.GetSelection() var iter gtk.TreeIter if ts.GetSelected(nil, &iter) { editProxy(&iter, func() {}) } }, "on_remove_proxy_signal": func() { ts, _ := data.proxiesView.GetSelection() var iter gtk.TreeIter if ts.GetSelected(nil, &iter) { data.proxies.Remove(&iter) } }, "on_add_proxy_signal": func() { iter := data.proxies.Append() data.proxies.SetValue(iter, 0, "tor-auto://") data.proxies.SetValue(iter, 1, "tor-auto://") ts, _ := data.proxiesView.GetSelection() ts.SelectIter(iter) editProxy(iter, func() { data.proxies.Remove(iter) }) }, "on_edit_activate_proxy_signal": func(_ *gtk.TreeView, path *gtk.TreePath) { iter, err := data.proxies.GetIter(path) if err == nil { editProxy(iter, func() {}) } }, "on_cancel_signal": func() { u.buildAccountsMenu() data.dialog.Destroy() }, "on_import_key_signal": func() { u.importKeysForDialog(account, data.dialog) }, "on_import_fpr_signal": func() { u.importFingerprintsForDialog(account, data.dialog) }, "on_export_key_signal": func() { u.exportKeysForDialog(account, data.dialog) }, "on_export_fpr_signal": func() { u.exportFingerprintsForDialog(account, data.dialog) }, }) data.dialog.SetTransientFor(u.window) data.dialog.ShowAll() data.notebook.SetCurrentPage(0) data.notebook.SetShowTabs(u.config.AdvancedOptions) if !u.config.AdvancedOptions { p2.Hide() p3.Hide() p4.Hide() } }