2018-08-19 22:27:02 +00:00
|
|
|
using Gee;
|
|
|
|
|
|
|
|
using Xmpp;
|
|
|
|
using Dino.Entities;
|
|
|
|
|
|
|
|
namespace Dino {
|
|
|
|
|
2018-11-16 15:27:31 +00:00
|
|
|
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) {
|
|
|
|
ConnectionManager.ConnectionError.Source? ret = null;
|
|
|
|
|
2020-11-16 14:55:33 +00:00
|
|
|
Gee.List<XmppStreamModule> list = new ArrayList<XmppStreamModule>();
|
|
|
|
list.add(new Iq.Module());
|
|
|
|
list.add(new Sasl.Module(account.bare_jid.to_string(), account.password));
|
|
|
|
|
2020-12-31 18:00:54 +00:00
|
|
|
XmppStreamResult stream_result = yield Xmpp.establish_stream(account.bare_jid.domain_jid, list, Application.print_xmpp,
|
2020-12-31 22:19:06 +00:00
|
|
|
(peer_cert, errors) => { return ConnectionManager.on_invalid_certificate(account.domainpart, peer_cert, errors); }
|
2020-12-31 18:00:54 +00:00
|
|
|
);
|
2020-11-16 14:55:33 +00:00
|
|
|
|
|
|
|
if (stream_result.stream == null) {
|
|
|
|
if (stream_result.tls_errors != null) {
|
|
|
|
ret = ConnectionManager.ConnectionError.Source.TLS;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
XmppStream stream = stream_result.stream;
|
|
|
|
|
2019-12-23 02:04:42 +00:00
|
|
|
SourceFunc callback = add_check_account.callback;
|
|
|
|
stream.stream_negotiated.connect(() => {
|
|
|
|
if (callback == null) return;
|
|
|
|
Idle.add((owned)callback);
|
2018-11-16 15:27:31 +00:00
|
|
|
});
|
2019-12-23 02:04:42 +00:00
|
|
|
stream.get_module(Sasl.Module.IDENTITY).received_auth_failure.connect((stream, node) => {
|
|
|
|
if (callback == null) return;
|
|
|
|
ret = ConnectionManager.ConnectionError.Source.SASL;
|
2018-11-16 15:27:31 +00:00
|
|
|
Idle.add((owned)callback);
|
|
|
|
});
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.begin((_, res) => {
|
2019-12-23 02:04:42 +00:00
|
|
|
try {
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.end(res);
|
2019-12-23 02:04:42 +00:00
|
|
|
} catch (Error e) {
|
|
|
|
debug("Error connecting to stream: %s", e.message);
|
|
|
|
}
|
|
|
|
if (callback != null) {
|
|
|
|
ret = ConnectionManager.ConnectionError.Source.CONNECTION;
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
2018-11-16 15:27:31 +00:00
|
|
|
|
|
|
|
yield;
|
|
|
|
|
2019-12-23 02:04:42 +00:00
|
|
|
try {
|
2020-11-16 14:55:33 +00:00
|
|
|
yield stream_result.stream.disconnect();
|
2019-12-23 02:04:42 +00:00
|
|
|
} catch (Error e) {}
|
2018-11-16 15:27:31 +00:00
|
|
|
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) {
|
|
|
|
ServerAvailabilityReturn ret = new ServerAvailabilityReturn() { available=false };
|
2020-11-16 14:55:33 +00:00
|
|
|
|
|
|
|
Gee.List<XmppStreamModule> list = new ArrayList<XmppStreamModule>();
|
|
|
|
list.add(new Iq.Module());
|
|
|
|
|
2020-12-31 18:00:54 +00:00
|
|
|
XmppStreamResult stream_result = yield Xmpp.establish_stream(jid.domain_jid, list, Application.print_xmpp,
|
2020-12-31 22:19:06 +00:00
|
|
|
(peer_cert, errors) => { return ConnectionManager.on_invalid_certificate(jid.domainpart, peer_cert, errors); }
|
2020-12-31 18:00:54 +00:00
|
|
|
);
|
2020-11-16 14:55:33 +00:00
|
|
|
|
|
|
|
if (stream_result.stream == null) {
|
|
|
|
if (stream_result.io_error != null) {
|
|
|
|
debug("Error connecting to stream: %s", stream_result.io_error.message);
|
|
|
|
}
|
|
|
|
if (stream_result.tls_errors != null) {
|
|
|
|
ret.error_flags = stream_result.tls_errors;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
XmppStream stream = stream_result.stream;
|
|
|
|
|
2018-11-16 15:27:31 +00:00
|
|
|
SourceFunc callback = check_server_availability.callback;
|
|
|
|
stream.stream_negotiated.connect(() => {
|
|
|
|
if (callback != null) {
|
|
|
|
ret.available = true;
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
2019-06-01 16:48:58 +00:00
|
|
|
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.begin((_, res) => {
|
2019-06-01 16:48:58 +00:00
|
|
|
try {
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.end(res);
|
2019-06-01 16:48:58 +00:00
|
|
|
} catch (Error e) {
|
|
|
|
debug("Error connecting to stream: %s", e.message);
|
|
|
|
}
|
2018-11-16 15:27:31 +00:00
|
|
|
if (callback != null) {
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
yield;
|
2019-06-01 16:48:58 +00:00
|
|
|
|
2018-11-16 15:27:31 +00:00
|
|
|
try {
|
2019-11-27 17:46:29 +00:00
|
|
|
yield stream.disconnect();
|
2018-11-16 15:27:31 +00:00
|
|
|
} catch (Error e) {}
|
|
|
|
return ret;
|
|
|
|
}
|
2018-08-19 22:27:02 +00:00
|
|
|
|
2020-12-31 18:04:18 +00:00
|
|
|
public class RegistrationFormReturn {
|
|
|
|
public Xep.InBandRegistration.Form? form { get; set; }
|
|
|
|
public TlsCertificateFlags? error_flags { get; set; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public static async RegistrationFormReturn get_registration_form(Jid jid) {
|
|
|
|
RegistrationFormReturn ret = new RegistrationFormReturn();
|
|
|
|
|
2020-11-16 14:55:33 +00:00
|
|
|
Gee.List<XmppStreamModule> list = new ArrayList<XmppStreamModule>();
|
|
|
|
list.add(new Iq.Module());
|
|
|
|
list.add(new Xep.InBandRegistration.Module());
|
|
|
|
|
2020-12-31 18:00:54 +00:00
|
|
|
XmppStreamResult stream_result = yield Xmpp.establish_stream(jid.domain_jid, list, Application.print_xmpp,
|
2020-12-31 22:19:06 +00:00
|
|
|
(peer_cert, errors) => { return ConnectionManager.on_invalid_certificate(jid.domainpart, peer_cert, errors); }
|
2020-12-31 18:00:54 +00:00
|
|
|
);
|
2020-11-16 14:55:33 +00:00
|
|
|
|
|
|
|
if (stream_result.stream == null) {
|
2020-12-31 18:04:18 +00:00
|
|
|
if (stream_result.io_error != null) {
|
|
|
|
debug("Error connecting to stream: %s", stream_result.io_error.message);
|
|
|
|
}
|
|
|
|
if (stream_result.tls_errors != null) {
|
|
|
|
ret.error_flags = stream_result.tls_errors;
|
|
|
|
}
|
|
|
|
return ret;
|
2020-11-16 14:55:33 +00:00
|
|
|
}
|
|
|
|
XmppStream stream = stream_result.stream;
|
2018-08-19 22:27:02 +00:00
|
|
|
|
|
|
|
SourceFunc callback = get_registration_form.callback;
|
2019-06-01 16:48:58 +00:00
|
|
|
|
2018-08-19 22:27:02 +00:00
|
|
|
stream.stream_negotiated.connect(() => {
|
|
|
|
if (callback != null) {
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
2019-06-01 16:48:58 +00:00
|
|
|
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.begin((_, res) => {
|
2019-06-01 16:48:58 +00:00
|
|
|
try {
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.end(res);
|
2019-06-01 16:48:58 +00:00
|
|
|
} catch (Error e) {
|
|
|
|
debug("Error connecting to stream: %s", e.message);
|
|
|
|
}
|
2018-08-19 22:27:02 +00:00
|
|
|
if (callback != null) {
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
2019-06-01 16:48:58 +00:00
|
|
|
|
2018-08-19 22:27:02 +00:00
|
|
|
yield;
|
2019-11-18 15:55:36 +00:00
|
|
|
|
2018-08-19 22:27:02 +00:00
|
|
|
if (stream.negotiation_complete) {
|
2020-12-31 18:04:18 +00:00
|
|
|
ret.form = yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).get_from_server(stream, jid);
|
2018-08-19 22:27:02 +00:00
|
|
|
}
|
2019-11-18 15:55:36 +00:00
|
|
|
try {
|
2019-11-27 17:46:29 +00:00
|
|
|
yield stream.disconnect();
|
2019-11-18 15:55:36 +00:00
|
|
|
} catch (Error e) {}
|
|
|
|
|
2020-12-31 18:04:18 +00:00
|
|
|
return ret;
|
2018-08-19 22:27:02 +00:00
|
|
|
}
|
|
|
|
|
2019-11-18 15:55:36 +00:00
|
|
|
public static async string? submit_form(Jid jid, Xep.InBandRegistration.Form form) {
|
2020-11-16 14:55:33 +00:00
|
|
|
Gee.List<XmppStreamModule> list = new ArrayList<XmppStreamModule>();
|
|
|
|
list.add(new Iq.Module());
|
|
|
|
list.add(new Xep.InBandRegistration.Module());
|
|
|
|
|
2020-12-31 18:00:54 +00:00
|
|
|
XmppStreamResult stream_result = yield Xmpp.establish_stream(jid.domain_jid, list, Application.print_xmpp,
|
2020-12-31 22:19:06 +00:00
|
|
|
(peer_cert, errors) => { return ConnectionManager.on_invalid_certificate(jid.domainpart, peer_cert, errors); }
|
2020-12-31 18:00:54 +00:00
|
|
|
);
|
2020-11-16 14:55:33 +00:00
|
|
|
|
|
|
|
if (stream_result.stream == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
XmppStream stream = stream_result.stream;
|
2019-11-18 15:55:36 +00:00
|
|
|
|
|
|
|
SourceFunc callback = submit_form.callback;
|
|
|
|
|
|
|
|
stream.stream_negotiated.connect(() => {
|
|
|
|
if (callback != null) {
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.begin((_, res) => {
|
2019-11-18 15:55:36 +00:00
|
|
|
try {
|
2020-11-16 14:55:33 +00:00
|
|
|
stream.loop.end(res);
|
2019-11-18 15:55:36 +00:00
|
|
|
} catch (Error e) {
|
|
|
|
debug("Error connecting to stream: %s", e.message);
|
|
|
|
}
|
|
|
|
if (callback != null) {
|
|
|
|
Idle.add((owned)callback);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
yield;
|
2019-12-23 02:04:42 +00:00
|
|
|
|
|
|
|
string? ret = null;
|
2019-11-18 15:55:36 +00:00
|
|
|
if (stream.negotiation_complete) {
|
2019-12-23 02:04:42 +00:00
|
|
|
ret = yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).submit_to_server(stream, jid, form);
|
2019-11-18 15:55:36 +00:00
|
|
|
}
|
2019-12-23 02:04:42 +00:00
|
|
|
try {
|
|
|
|
yield stream.disconnect();
|
|
|
|
} catch (Error e) {}
|
|
|
|
return ret;
|
2018-08-19 22:27:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|