aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/service
diff options
context:
space:
mode:
authorfiaxh <git@mx.ax.lt>2018-11-16 16:27:31 +0100
committerfiaxh <git@mx.ax.lt>2018-11-16 09:29:34 -0600
commitfa731a46235e7d6b46450f339539247d3671514b (patch)
treee0a41471479bc00a15ac1fefc029e5e71b616c68 /libdino/src/service
parent45236d07bca544f44c0861d0df50c4b40e55a6dd (diff)
downloaddino-fa731a46235e7d6b46450f339539247d3671514b.tar.gz
dino-fa731a46235e7d6b46450f339539247d3671514b.zip
Split login jid/password into two steps with checks
Diffstat (limited to 'libdino/src/service')
-rw-r--r--libdino/src/service/connection_manager.vala4
-rw-r--r--libdino/src/service/registration.vala86
-rw-r--r--libdino/src/service/stream_interactor.vala8
3 files changed, 91 insertions, 7 deletions
diff --git a/libdino/src/service/connection_manager.vala b/libdino/src/service/connection_manager.vala
index 2abbc9cb..6a7964a0 100644
--- a/libdino/src/service/connection_manager.vala
+++ b/libdino/src/service/connection_manager.vala
@@ -5,7 +5,7 @@ using Dino.Entities;
namespace Dino {
-public class ConnectionManager {
+public class ConnectionManager : Object {
public signal void stream_opened(Account account, XmppStream stream);
public signal void connection_state_changed(Account account, ConnectionState state);
@@ -133,7 +133,7 @@ public class ConnectionManager {
connections[account].stream.get_module(Presence.Module.IDENTITY).send_presence(connections[account].stream, presence);
}
- public void disconnect(Account account) {
+ public void disconnect_account(Account account) {
if (connections.has_key(account)) {
make_offline(account);
try {
diff --git a/libdino/src/service/registration.vala b/libdino/src/service/registration.vala
index 32d8b04b..8cac355e 100644
--- a/libdino/src/service/registration.vala
+++ b/libdino/src/service/registration.vala
@@ -5,12 +5,96 @@ using Dino.Entities;
namespace Dino {
-public class Register {
+public class Register : StreamInteractionModule, Object{
+ public static ModuleIdentity<Register> IDENTITY = new ModuleIdentity<Register>("registration");
+ public string id { get { return IDENTITY.id; } }
+
+ private StreamInteractor stream_interactor;
+ private Database db;
+
+ public static void start(StreamInteractor stream_interactor, Database db) {
+ Register m = new Register(stream_interactor, db);
+ stream_interactor.add_module(m);
+ }
+
+ private Register(StreamInteractor stream_interactor, Database db) {
+ this.stream_interactor = stream_interactor;
+ this.db = db;
+ }
+
+ public async ConnectionManager.ConnectionError.Source? add_check_account(Account account) {
+ SourceFunc callback = add_check_account.callback;
+ ConnectionManager.ConnectionError.Source? ret = null;
+
+ ulong handler_id_connected = stream_interactor.stream_negotiated.connect((connected_account, stream) => {
+ if (connected_account.equals(account)) {
+ account.persist(db);
+ account.enabled = true;
+ Idle.add((owned)callback);
+ }
+ });
+ ulong handler_id_error = stream_interactor.connection_manager.connection_error.connect((connected_account, error) => {
+ if (connected_account.equals(account)) {
+ ret = error.source;
+ }
+ stream_interactor.disconnect_account(account);
+ Idle.add((owned)callback);
+ });
+
+ stream_interactor.connect_account(account);
+ yield;
+ stream_interactor.disconnect(handler_id_connected);
+ stream_interactor.connection_manager.disconnect(handler_id_error);
+
+ return ret;
+ }
+
+ public class ServerAvailabilityReturn {
+ public bool available { get; set; }
+ public TlsCertificateFlags? error_flags { get; set; }
+ }
+
+ public static async ServerAvailabilityReturn check_server_availability(Jid jid) {
+ XmppStream stream = new XmppStream();
+ stream.add_module(new Tls.Module());
+ stream.add_module(new Iq.Module());
+ stream.add_module(new Xep.SrvRecordsTls.Module());
+
+ ServerAvailabilityReturn ret = new ServerAvailabilityReturn() { available=false };
+ SourceFunc callback = check_server_availability.callback;
+ stream.stream_negotiated.connect(() => {
+ if (callback != null) {
+ ret.available = true;
+ Idle.add((owned)callback);
+ }
+ });
+ stream.get_module(Tls.Module.IDENTITY).invalid_certificate.connect((peer_cert, errors) => {
+ if (callback != null) {
+
+ ret.error_flags = errors;
+ Idle.add((owned)callback);
+ }
+ });
+ Timeout.add_seconds(5, () => {
+ if (callback != null) {
+ Idle.add((owned)callback);
+ }
+ return false;
+ });
+
+ stream.connect.begin(jid.domainpart);
+ yield;
+ try {
+ stream.disconnect();
+ } catch (Error e) {}
+ return ret;
+ }
public static async Xep.InBandRegistration.Form get_registration_form(Jid jid) {
XmppStream stream = new XmppStream();
stream.add_module(new Tls.Module());
stream.add_module(new Iq.Module());
+ stream.add_module(new Xep.SrvRecordsTls.Module());
stream.add_module(new Xep.InBandRegistration.Module());
stream.connect.begin(jid.bare_jid.to_string());
diff --git a/libdino/src/service/stream_interactor.vala b/libdino/src/service/stream_interactor.vala
index d9f3f0ec..55ab8984 100644
--- a/libdino/src/service/stream_interactor.vala
+++ b/libdino/src/service/stream_interactor.vala
@@ -5,7 +5,7 @@ using Dino.Entities;
namespace Dino {
-public class StreamInteractor {
+public class StreamInteractor : Object {
public signal void account_added(Account account);
public signal void account_removed(Account account);
@@ -23,14 +23,14 @@ public class StreamInteractor {
connection_manager.stream_opened.connect(on_stream_opened);
}
- public void connect(Account account) {
+ public void connect_account(Account account) {
module_manager.initialize(account);
account_added(account);
connection_manager.connect(account);
}
- public void disconnect(Account account) {
- connection_manager.disconnect(account);
+ public void disconnect_account(Account account) {
+ connection_manager.disconnect_account(account);
account_removed(account);
}