From fc8fdc166bf044035045aa7b10a6308895d2f3e6 Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Thu, 28 Dec 2023 01:23:02 +0100 Subject: [PATCH 1/6] wip, fixes https://github.com/dino/dino/issues/261 - server refuses to responds in any way to the sent iq stanza and i don't know why, when i send it with the xml console in gajim it works well --- libdino/src/service/registration.vala | 6 + main/CMakeLists.txt | 2 + main/data/gresource.xml | 1 + .../manage_accounts/change_password_dialog.ui | 113 ++++++++++++++++++ main/data/manage_accounts/dialog.ui | 12 +- main/meson.build | 1 + .../change_password_dialog.vala | 77 ++++++++++++ main/src/ui/manage_accounts/dialog.vala | 12 ++ .../module/xep/0077_in_band_registration.vala | 24 ++++ 9 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 main/data/manage_accounts/change_password_dialog.ui create mode 100644 main/src/ui/manage_accounts/change_password_dialog.vala diff --git a/libdino/src/service/registration.vala b/libdino/src/service/registration.vala index 4255f322..853a2994 100644 --- a/libdino/src/service/registration.vala +++ b/libdino/src/service/registration.vala @@ -71,6 +71,12 @@ public class Register : StreamInteractionModule, Object{ return ret; } + public async void change_password(Account account, string new_pw){ + XmppStream stream = stream_interactor.get_stream(account); + if (stream == null) return; + yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).change_password(stream, account.full_jid, new_pw); + } + public class ServerAvailabilityReturn { public bool available { get; set; } public TlsCertificateFlags? error_flags { get; set; } diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index ea4de99b..13988c87 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -78,6 +78,7 @@ set(RESOURCE_LIST conversation_content_view/view.ui manage_accounts/account_row.ui manage_accounts/add_account_dialog.ui + manage_accounts/change_password_dialog.ui manage_accounts/dialog.ui menu_add.ui menu_app.ui @@ -217,6 +218,7 @@ SOURCES src/ui/manage_accounts/account_row.vala src/ui/manage_accounts/add_account_dialog.vala + src/ui/manage_accounts/change_password_dialog.vala src/ui/manage_accounts/dialog.vala src/ui/occupant_menu/list.vala diff --git a/main/data/gresource.xml b/main/data/gresource.xml index 282838e0..a2e3f047 100644 --- a/main/data/gresource.xml +++ b/main/data/gresource.xml @@ -58,6 +58,7 @@ manage_accounts/account_row.ui manage_accounts/add_account_dialog.ui manage_accounts/dialog.ui + manage_accounts/change_password_dialog.ui menu_add.ui menu_app.ui menu_conversation.ui diff --git a/main/data/manage_accounts/change_password_dialog.ui b/main/data/manage_accounts/change_password_dialog.ui new file mode 100644 index 00000000..df670d78 --- /dev/null +++ b/main/data/manage_accounts/change_password_dialog.ui @@ -0,0 +1,113 @@ + + + + + diff --git a/main/data/manage_accounts/dialog.ui b/main/data/manage_accounts/dialog.ui index 4931507c..0a76c361 100644 --- a/main/data/manage_accounts/dialog.ui +++ b/main/data/manage_accounts/dialog.ui @@ -165,7 +165,17 @@ 1 2 - 2 + 1 + + + + + + ⚙️ + + 2 + 2 + 1 diff --git a/main/meson.build b/main/meson.build index 1b5abcfc..ee17404c 100644 --- a/main/meson.build +++ b/main/meson.build @@ -71,6 +71,7 @@ sources = files( 'src/ui/main_window_controller.vala', 'src/ui/manage_accounts/account_row.vala', 'src/ui/manage_accounts/add_account_dialog.vala', + 'src/ui/manage_accounts/change_password_dialog.vala', 'src/ui/manage_accounts/dialog.vala', 'src/ui/notifier_freedesktop.vala', 'src/ui/notifier_gnotifications.vala', diff --git a/main/src/ui/manage_accounts/change_password_dialog.vala b/main/src/ui/manage_accounts/change_password_dialog.vala new file mode 100644 index 00000000..2c6db522 --- /dev/null +++ b/main/src/ui/manage_accounts/change_password_dialog.vala @@ -0,0 +1,77 @@ +using Gee; +using Gtk; +//using Pango; + +using Dino.Entities; +using Xmpp; + +namespace Dino.Ui{ + +[GtkTemplate (ui = "/im/dino/Dino/manage_accounts/change_password_dialog.ui")] + public class ChangePasswordDialog : Gtk.Dialog { + + [GtkChild] private unowned Button ok_button; + [GtkChild] private unowned Button cancel_button; + [GtkChild] private unowned Entry current_passwd_entry; + [GtkChild] private unowned Entry new_passwd_entry; + [GtkChild] private unowned Entry confirm_new_passwd_entry; + private bool are_forms_empty; + private Account account; + private StreamInteractor stream_interactor; + + public ChangePasswordDialog(Account a, StreamInteractor s){ + Object(use_header_bar : 1); + this.stream_interactor = s; + this.account = a; + cancel_button.clicked.connect(() => { close(); }); + current_passwd_entry.changed.connect(on_current_passwd_entry_changed); + new_passwd_entry.changed.connect(on_new_passwd_entry_changed); + confirm_new_passwd_entry.changed.connect(on_confirm_new_passwd_entry_changed); + ok_button.clicked.connect(on_ok_button_clicked); + } + + private void are_psswd_nonempty(){ + if (current_passwd_entry.get_text_length() > 0 && new_passwd_entry.get_text_length() > 0 && confirm_new_passwd_entry.get_text_length() > 0){ + are_forms_empty = false; + ok_button.sensitive = true; + } else { + are_forms_empty = true; + ok_button.sensitive = false; + } + } + + private void check_new_passwd(){ + EntryBuffer newpsswd = new_passwd_entry.get_buffer(); + EntryBuffer confirm_newpsswd = confirm_new_passwd_entry.get_buffer(); + + if (newpsswd.get_text() != confirm_newpsswd.get_text()){ + new_passwd_entry.add_css_class("error"); + } else { + new_passwd_entry.remove_css_class("error"); + } + } + + private void on_current_passwd_entry_changed(){ + are_psswd_nonempty(); + } + + private void on_new_passwd_entry_changed(){ + are_psswd_nonempty(); + check_new_passwd(); + } + + private void on_confirm_new_passwd_entry_changed(){ + are_psswd_nonempty(); + check_new_passwd(); + } + + private async void on_ok_button_clicked(){ + string? pw_input = current_passwd_entry.get_buffer().get_text(); + string? new_pw_input = new_passwd_entry.get_buffer().get_text(); + if(pw_input != null && account.password == pw_input){ + stream_interactor.get_module(Register.IDENTITY).change_password.begin(account, new_pw_input); +// close(); + } + } + } +} diff --git a/main/src/ui/manage_accounts/dialog.vala b/main/src/ui/manage_accounts/dialog.vala index a326aeff..365d4c3c 100644 --- a/main/src/ui/manage_accounts/dialog.vala +++ b/main/src/ui/manage_accounts/dialog.vala @@ -25,6 +25,7 @@ public class Dialog : Gtk.Dialog { [GtkChild] public unowned Label state_label; [GtkChild] public unowned Switch active_switch; [GtkChild] public unowned Util.EntryLabelHybrid password_hybrid; + [GtkChild] public unowned Button password_change_btn; [GtkChild] public unowned Util.EntryLabelHybrid alias_hybrid; [GtkChild] public unowned Grid settings_list; @@ -44,10 +45,12 @@ public class Dialog : Gtk.Dialog { image_button.clicked.connect(show_select_avatar); alias_hybrid.entry.changed.connect(() => { selected_account.alias = alias_hybrid.text; }); password_hybrid.entry.changed.connect(() => { selected_account.password = password_hybrid.text; }); + password_change_btn.clicked.connect(show_change_psswd_dialog); Util.LabelHybridGroup label_hybrid_group = new Util.LabelHybridGroup(); label_hybrid_group.add(alias_hybrid); label_hybrid_group.add(password_hybrid); + password_change_btn.sensitive = false; main_stack.set_visible_child_name("no_accounts"); @@ -109,6 +112,12 @@ public class Dialog : Gtk.Dialog { add_account_dialog.present(); } + private void show_change_psswd_dialog() { + ChangePasswordDialog change_psswd_dialog = new ChangePasswordDialog(selected_account, stream_interactor); + change_psswd_dialog.set_transient_for(this); + change_psswd_dialog.present(); + } +// private void remove_account(AccountRow account_item) { Gtk.MessageDialog msg = new Gtk.MessageDialog ( this, Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, @@ -215,8 +224,10 @@ public class Dialog : Gtk.Dialog { case ConnectionManager.ConnectionState.CONNECTING: state_label.label = _("Connecting…"); break; case ConnectionManager.ConnectionState.CONNECTED: + password_change_btn.sensitive = true; state_label.label = _("Connected"); break; case ConnectionManager.ConnectionState.DISCONNECTED: + password_change_btn.sensitive = false; state_label.label = _("Disconnected"); break; } state_label.remove_css_class("is_error"); @@ -224,6 +235,7 @@ public class Dialog : Gtk.Dialog { } private string get_connection_error_description(ConnectionManager.ConnectionError error) { + password_change_btn.sensitive = false; switch (error.source) { case ConnectionManager.ConnectionError.Source.SASL: return _("Wrong password"); diff --git a/xmpp-vala/src/module/xep/0077_in_band_registration.vala b/xmpp-vala/src/module/xep/0077_in_band_registration.vala index baaa4ee0..89a31c3c 100644 --- a/xmpp-vala/src/module/xep/0077_in_band_registration.vala +++ b/xmpp-vala/src/module/xep/0077_in_band_registration.vala @@ -29,6 +29,30 @@ public class Module : XmppStreamNegotiationModule { return null; } + + public async void change_password(XmppStream stream, Jid jid, string new_pw) { + StanzaNode pw_change_node = new StanzaNode.build("query",NS_URI).add_self_xmlns(); + StanzaNode username_node = new StanzaNode.build("username"); + StanzaNode pw_node = new StanzaNode.build("password"); + username_node.put_node(new StanzaNode.text(jid.localpart)); + pw_node.put_node(new StanzaNode.text(new_pw)); + pw_change_node.put_node(username_node); + pw_change_node.put_node(pw_node); + //pw_change_node.put_node(new StanzaNode.build()); +// StanzaNode execute_chpw = new StanzaNode.build("command","http://jabber.org/protocol/commands").add_self_xmlns(); +// execute_chpw.put_attribute("node","passwd"); +// execute_chpw.put_attribute("action","execute"); + Iq.Stanza set_password_iq = new Iq.Stanza.set(pw_change_node, "changepwtest") { to=jid.bare_jid.domain_jid }; + +// Iq.Stanza set_password_iq = new Iq.Stanza.set(execute_chpw) { to=jid.bare_jid.domain_jid }; + Iq.Stanza chpw_result = yield stream.get_module(Iq.Module.IDENTITY).send_iq_async(stream, set_password_iq); + if (chpw_result.is_error()) { + ErrorStanza? error_stanza = chpw_result.get_error(); + stderr.printf("\n" + error_stanza.text ?? "Error when trying to change password \n"); + } +// StanzaNode changepw_node = new StanzaNode.build("query", NS_URI).add_self_xmlns(); + + } public override bool mandatory_outstanding(XmppStream stream) { return false; } From 1a73e9d53d0a2ce1ffaa335c6e23f982ba30ca02 Mon Sep 17 00:00:00 2001 From: Stanislav Malishevskiy Date: Tue, 12 Mar 2024 10:39:46 +0300 Subject: [PATCH 2/6] Fix issue #261. --- libdino/src/service/registration.vala | 9 +- .../manage_accounts/change_password_dialog.ui | 87 ++++++++++++++----- main/po/ar.po | 18 ++++ main/po/ca.po | 18 ++++ main/po/cs.po | 17 ++++ main/po/da.po | 17 ++++ main/po/de.po | 17 ++++ main/po/dino.pot | 17 ++++ main/po/el.po | 17 ++++ main/po/en.po | 17 ++++ main/po/eo.po | 18 ++++ main/po/es.po | 17 ++++ main/po/eu.po | 17 ++++ main/po/fa.po | 17 ++++ main/po/fi.po | 17 ++++ main/po/fr.po | 17 ++++ main/po/gl.po | 17 ++++ main/po/hu.po | 17 ++++ main/po/id.po | 17 ++++ main/po/ie.po | 17 ++++ main/po/is.po | 17 ++++ main/po/it.po | 17 ++++ main/po/ja.po | 17 ++++ main/po/kab.po | 17 ++++ main/po/ko.po | 17 ++++ main/po/lb.po | 17 ++++ main/po/lt.po | 17 ++++ main/po/lv.po | 17 ++++ main/po/nb.po | 17 ++++ main/po/nl.po | 17 ++++ main/po/oc.po | 17 ++++ main/po/pl.po | 17 ++++ main/po/pt.po | 17 ++++ main/po/pt_BR.po | 17 ++++ main/po/ro.po | 17 ++++ main/po/ru.po | 17 ++++ main/po/sq.po | 17 ++++ main/po/sv.po | 17 ++++ main/po/ta.po | 17 ++++ main/po/tr.po | 17 ++++ main/po/uk.po | 17 ++++ main/po/zh_CN.po | 17 ++++ main/po/zh_TW.po | 17 ++++ .../change_password_dialog.vala | 41 +++++++-- .../module/xep/0077_in_band_registration.vala | 19 ++-- 45 files changed, 810 insertions(+), 46 deletions(-) diff --git a/libdino/src/service/registration.vala b/libdino/src/service/registration.vala index 853a2994..c75531b4 100644 --- a/libdino/src/service/registration.vala +++ b/libdino/src/service/registration.vala @@ -71,10 +71,10 @@ public class Register : StreamInteractionModule, Object{ return ret; } - public async void change_password(Account account, string new_pw){ - XmppStream stream = stream_interactor.get_stream(account); - if (stream == null) return; - yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).change_password(stream, account.full_jid, new_pw); + public async string? change_password(Account account, string new_pw){ + XmppStream stream = stream_interactor.get_stream(account); + if (stream == null) return "Connection unavailable"; + return yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).change_password(stream, account.full_jid, new_pw); } public class ServerAvailabilityReturn { @@ -235,3 +235,4 @@ public class Register : StreamInteractionModule, Object{ } } + diff --git a/main/data/manage_accounts/change_password_dialog.ui b/main/data/manage_accounts/change_password_dialog.ui index df670d78..67e1ce6a 100644 --- a/main/data/manage_accounts/change_password_dialog.ui +++ b/main/data/manage_accounts/change_password_dialog.ui @@ -5,25 +5,6 @@ Change password center True - - - False - - - Cancel - - - - - Next - 0 - - - - - @@ -59,7 +40,7 @@ - New password + New password 1 0 @@ -101,13 +82,77 @@ + + + + center + True + 7 + + + + + 0 + 3 + 2 + + + + + + Cancel + + 0 + 4 + + + + + + end + True + 0 + + 1 + 4 + + + + + + + label + + + Change password + + + + + + + spinner + + + True + + + + + + + + cancel_button - ok_button + change_password_button diff --git a/main/po/ar.po b/main/po/ar.po index 5ea8c2f3..45a0248a 100644 --- a/main/po/ar.po +++ b/main/po/ar.po @@ -1176,6 +1176,24 @@ msgstr "لقد أعددت كل شيء!" msgid "Finish" msgstr "أنهي" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "اضغط هنا لبداية المحادثة أو للإنضمام إلى قناة." diff --git a/main/po/ca.po b/main/po/ca.po index 8075b8b9..6ce1dc26 100644 --- a/main/po/ca.po +++ b/main/po/ca.po @@ -1163,6 +1163,24 @@ msgstr "Tot llest!" msgid "Finish" msgstr "Finalitza" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Feu clic aquí per a començar una conversa o unir-vos a un canal." diff --git a/main/po/cs.po b/main/po/cs.po index 09cc262f..4d9f1116 100644 --- a/main/po/cs.po +++ b/main/po/cs.po @@ -1166,5 +1166,22 @@ msgstr "Vše připraveno!" msgid "Finish" msgstr "Dokončit" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Kliknutím sem zahájíte konverzaci nebo se připojíte ke kanálu." diff --git a/main/po/da.po b/main/po/da.po index bd134027..8891ccc2 100644 --- a/main/po/da.po +++ b/main/po/da.po @@ -1153,3 +1153,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/de.po b/main/po/de.po index 4dc48850..d8f5dbda 100644 --- a/main/po/de.po +++ b/main/po/de.po @@ -1161,6 +1161,23 @@ msgstr "Fertig!" msgid "Finish" msgstr "Fertig" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Klicke hier, um eine Unterhaltung zu starten oder einem Kanal beizutreten." diff --git a/main/po/dino.pot b/main/po/dino.pot index 7d85975f..173f601b 100644 --- a/main/po/dino.pot +++ b/main/po/dino.pot @@ -1154,3 +1154,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/el.po b/main/po/el.po index b363d32b..9ca055ca 100644 --- a/main/po/el.po +++ b/main/po/el.po @@ -1169,6 +1169,23 @@ msgstr "Όλα έτοιμα!" msgid "Finish" msgstr "Ολοκλήρωση" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Κάντε κλικ εδώ για να ξεκινήσετε μια συνομιλία ή να εισέλθετε σε ένα " diff --git a/main/po/en.po b/main/po/en.po index 96bdf526..7fb7fc6f 100644 --- a/main/po/en.po +++ b/main/po/en.po @@ -1144,3 +1144,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/eo.po b/main/po/eo.po index bb1006fe..4f3e8046 100644 --- a/main/po/eo.po +++ b/main/po/eo.po @@ -1162,6 +1162,24 @@ msgstr "Ĉio pretas!" msgid "Finish" msgstr "Fini" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Alklaku ĉi tie por komenci konversacion aŭ aliĝi al kanalo." diff --git a/main/po/es.po b/main/po/es.po index 65f76f50..aac068e1 100644 --- a/main/po/es.po +++ b/main/po/es.po @@ -1166,6 +1166,23 @@ msgstr "¡Todo listo!" msgid "Finish" msgstr "Finalizado" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Pulsar aquí para iniciar una conversación o unirse a un conversación en " diff --git a/main/po/eu.po b/main/po/eu.po index 29f22e04..6395950d 100644 --- a/main/po/eu.po +++ b/main/po/eu.po @@ -1165,6 +1165,23 @@ msgstr "Guztia ezarri da!" msgid "Finish" msgstr "Amaitu" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Klikatu hemen elkarrizketa berri bat hasi edo kanal batean sartzeko." diff --git a/main/po/fa.po b/main/po/fa.po index d5b0db08..4fff8de3 100644 --- a/main/po/fa.po +++ b/main/po/fa.po @@ -1161,6 +1161,23 @@ msgstr "همه تنظیم شده!" msgid "Finish" msgstr "اتمام" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "برای شروع گفتگو یا پیوستن به کانال اینجا کلیک کنید." diff --git a/main/po/fi.po b/main/po/fi.po index e5e15c6e..30079480 100644 --- a/main/po/fi.po +++ b/main/po/fi.po @@ -1164,6 +1164,23 @@ msgstr "" msgid "Finish" msgstr "" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "No active conversations" #~ msgstr "Ei aktiivisia keskusteluja" diff --git a/main/po/fr.po b/main/po/fr.po index a38bced7..603a76a4 100644 --- a/main/po/fr.po +++ b/main/po/fr.po @@ -1166,6 +1166,23 @@ msgstr "Tout est prêt !" msgid "Finish" msgstr "Terminer" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Cliquez ici pour commencer une discussion ou rejoindre un salon." diff --git a/main/po/gl.po b/main/po/gl.po index ac79cdf4..6d8c4786 100644 --- a/main/po/gl.po +++ b/main/po/gl.po @@ -1166,6 +1166,23 @@ msgstr "Todo feito!" msgid "Finish" msgstr "Rematar" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Preme aquí para iniciar unha conversa ou unirte a unha canle." diff --git a/main/po/hu.po b/main/po/hu.po index dc432bcc..c9dad0bb 100644 --- a/main/po/hu.po +++ b/main/po/hu.po @@ -1169,6 +1169,23 @@ msgstr "Minden készen áll!" msgid "Finish" msgstr "Befejezés" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Kattintson ide egy beszélgetés indításához vagy egy csatornához való " diff --git a/main/po/id.po b/main/po/id.po index 67ec4776..c8081964 100644 --- a/main/po/id.po +++ b/main/po/id.po @@ -1157,5 +1157,22 @@ msgstr "Selesai!" msgid "Finish" msgstr "Selesai" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Klik untuk memulai percakapan atau bergabung dengan channel." diff --git a/main/po/ie.po b/main/po/ie.po index a865fd12..2b822334 100644 --- a/main/po/ie.po +++ b/main/po/ie.po @@ -1161,6 +1161,23 @@ msgstr "Omni es pret!" msgid "Finish" msgstr "Finir" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Fa un clic ti-ci por iniciar un conversation o adherer a un channel." diff --git a/main/po/is.po b/main/po/is.po index 229a38f1..e19c40df 100644 --- a/main/po/is.po +++ b/main/po/is.po @@ -1161,5 +1161,22 @@ msgstr "Allt klárt!" msgid "Finish" msgstr "Loka" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Smelltu hér til að hefja samtal eða taka þátt í rás." diff --git a/main/po/it.po b/main/po/it.po index 08865a7e..7ea3cef8 100644 --- a/main/po/it.po +++ b/main/po/it.po @@ -1165,6 +1165,23 @@ msgstr "Tutto pronto!" msgid "Finish" msgstr "Fine" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Fai clic qui per iniziare una conversazione o per entrare in un canale." diff --git a/main/po/ja.po b/main/po/ja.po index f246346f..58b3a272 100644 --- a/main/po/ja.po +++ b/main/po/ja.po @@ -1158,6 +1158,23 @@ msgstr "すべてのセットアップが完了しました!" msgid "Finish" msgstr "完了" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "トークを始めたりトークルームに参加したりするには、ここをクリックしてくださ" diff --git a/main/po/kab.po b/main/po/kab.po index 40fd2977..8d0349b1 100644 --- a/main/po/kab.po +++ b/main/po/kab.po @@ -1153,3 +1153,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/ko.po b/main/po/ko.po index 9b3e6a8b..4466fb6d 100644 --- a/main/po/ko.po +++ b/main/po/ko.po @@ -1166,5 +1166,22 @@ msgstr "모든 설정이 끝났습니다!" msgid "Finish" msgstr "완료" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "대화를 시작하거나 채널에 들어가려면 여기를 누르세요." diff --git a/main/po/lb.po b/main/po/lb.po index 416fa5aa..8377432d 100644 --- a/main/po/lb.po +++ b/main/po/lb.po @@ -1157,6 +1157,23 @@ msgstr "Alles ageriicht!" msgid "Finish" msgstr "Ofschléissen" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Klick hei fir eng Konversatioun ze starten oder engem Channel " diff --git a/main/po/lt.po b/main/po/lt.po index 20c270a3..9035256f 100644 --- a/main/po/lt.po +++ b/main/po/lt.po @@ -1169,6 +1169,23 @@ msgstr "Viskas nustatyta!" msgid "Finish" msgstr "Užbaigti" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Spustelėkite čia norėdami pradėti pokalbį ar prisijungti prie kanalo." diff --git a/main/po/lv.po b/main/po/lv.po index fdee4199..af924a59 100644 --- a/main/po/lv.po +++ b/main/po/lv.po @@ -1154,3 +1154,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/nb.po b/main/po/nb.po index 4f5b2e50..511e1ea3 100644 --- a/main/po/nb.po +++ b/main/po/nb.po @@ -1167,6 +1167,23 @@ msgstr "Ferdig oppsatt." msgid "Finish" msgstr "Fullfør" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Klikk her for å starte en samtale, eller ta del i en kanal." diff --git a/main/po/nl.po b/main/po/nl.po index 8d152e74..11b6bafb 100644 --- a/main/po/nl.po +++ b/main/po/nl.po @@ -1163,6 +1163,23 @@ msgstr "Klaar!" msgid "Finish" msgstr "Voltooien" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Klik hier om een gesprek te starten of deel te nemen aan een kanaal." diff --git a/main/po/oc.po b/main/po/oc.po index f9bee16c..d310d343 100644 --- a/main/po/oc.po +++ b/main/po/oc.po @@ -1165,6 +1165,23 @@ msgstr "Tot es prèst !" msgid "Finish" msgstr "Terminar" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Clicatz aquí per començar una conversacion o jónher una sala." diff --git a/main/po/pl.po b/main/po/pl.po index 76f1e624..174b6d28 100644 --- a/main/po/pl.po +++ b/main/po/pl.po @@ -1169,6 +1169,23 @@ msgstr "Wszystko gotowe!" msgid "Finish" msgstr "Zakończ" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Kliknij tutaj, aby rozpocząć rozmowę albo dołączyć do kanału." diff --git a/main/po/pt.po b/main/po/pt.po index fab43cb0..c4859523 100644 --- a/main/po/pt.po +++ b/main/po/pt.po @@ -1163,5 +1163,22 @@ msgstr "Tudo configurado!" msgid "Finish" msgstr "Finalizado" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Clique aqui para iniciar uma conversa or entrar num canal." diff --git a/main/po/pt_BR.po b/main/po/pt_BR.po index 1160283a..4be1f263 100644 --- a/main/po/pt_BR.po +++ b/main/po/pt_BR.po @@ -1164,6 +1164,23 @@ msgstr "Tudo configurado!" msgid "Finish" msgstr "Finalizado" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Clique aqui para inicial uma conversa ou entrar em um canal." diff --git a/main/po/ro.po b/main/po/ro.po index 8f4388e9..eea63000 100644 --- a/main/po/ro.po +++ b/main/po/ro.po @@ -1170,6 +1170,23 @@ msgstr "Gata!" msgid "Finish" msgstr "Finalizare" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "" #~ "Apăsați aici pentru a porni o conversație sau a vă alătura unui canal." diff --git a/main/po/ru.po b/main/po/ru.po index c9fcefad..5483b5da 100644 --- a/main/po/ru.po +++ b/main/po/ru.po @@ -1167,6 +1167,23 @@ msgstr "Всё готово!" msgid "Finish" msgstr "Закончить" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "Изменить пароль" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "Текущий пароль" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "Новый пароль" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "Подтверждение пароля" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Нажмите здесь, чтобы начать беседу или присоединиться к каналу." diff --git a/main/po/sq.po b/main/po/sq.po index 88f472da..6aeee5b0 100644 --- a/main/po/sq.po +++ b/main/po/sq.po @@ -1163,5 +1163,22 @@ msgstr "Gjithçka e ujdisur!" msgid "Finish" msgstr "Përfundoje" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Klikoni këtu që të nisni një bisedë ose të hyni në një kanal." diff --git a/main/po/sv.po b/main/po/sv.po index 270f106a..1fa821a6 100644 --- a/main/po/sv.po +++ b/main/po/sv.po @@ -1163,6 +1163,23 @@ msgstr "Färdigt!" msgid "Finish" msgstr "Slutför" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Klicka här för att starta en konversation eller gå med i en kanal." diff --git a/main/po/ta.po b/main/po/ta.po index e930c0cf..15d310e4 100644 --- a/main/po/ta.po +++ b/main/po/ta.po @@ -1153,3 +1153,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/tr.po b/main/po/tr.po index ad8e50cf..b37c77aa 100644 --- a/main/po/tr.po +++ b/main/po/tr.po @@ -1162,6 +1162,23 @@ msgstr "Hepsi tamam!" msgid "Finish" msgstr "Bitir" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "Bir sohbet başlatmak ya da kanala katılmak için buraya tıkla." diff --git a/main/po/uk.po b/main/po/uk.po index fa80ba42..f1d47853 100644 --- a/main/po/uk.po +++ b/main/po/uk.po @@ -1158,3 +1158,20 @@ msgstr "" #: main/data/manage_accounts/add_account_dialog.ui:506 msgid "Finish" msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" diff --git a/main/po/zh_CN.po b/main/po/zh_CN.po index 5a0b8021..2f960b70 100644 --- a/main/po/zh_CN.po +++ b/main/po/zh_CN.po @@ -1155,6 +1155,23 @@ msgstr "都准备好了!" msgid "Finish" msgstr "完成" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "点击此处以开始对话或加入频道。" diff --git a/main/po/zh_TW.po b/main/po/zh_TW.po index 7d526477..da5b446d 100644 --- a/main/po/zh_TW.po +++ b/main/po/zh_TW.po @@ -1154,6 +1154,23 @@ msgstr "全部設定好了!" msgid "Finish" msgstr "完成" +#: main/src/ui/manage_accounts/change_password_dialog.vala :5 +#: main/src/ui/manage_accounts/change_password_dialog.vala :103 +msgid "Change password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :21 +msgid "Current password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :43 +msgid "New password" +msgstr "" + +#: main/src/ui/manage_accounts/change_password_dialog.vala :65 +msgid "Confirm new password" +msgstr "" + #~ msgid "Click here to start a conversation or join a channel." #~ msgstr "點擊此處開始對話或加入聊天室。" diff --git a/main/src/ui/manage_accounts/change_password_dialog.vala b/main/src/ui/manage_accounts/change_password_dialog.vala index 2c6db522..12b5f826 100644 --- a/main/src/ui/manage_accounts/change_password_dialog.vala +++ b/main/src/ui/manage_accounts/change_password_dialog.vala @@ -10,11 +10,14 @@ namespace Dino.Ui{ [GtkTemplate (ui = "/im/dino/Dino/manage_accounts/change_password_dialog.ui")] public class ChangePasswordDialog : Gtk.Dialog { - [GtkChild] private unowned Button ok_button; + [GtkChild] private unowned Button change_password_button; + [GtkChild] private unowned Stack change_password_stack; [GtkChild] private unowned Button cancel_button; [GtkChild] private unowned Entry current_passwd_entry; [GtkChild] private unowned Entry new_passwd_entry; [GtkChild] private unowned Entry confirm_new_passwd_entry; + [GtkChild] private unowned Label change_password_error_label; + private bool are_forms_empty; private Account account; private StreamInteractor stream_interactor; @@ -23,20 +26,27 @@ namespace Dino.Ui{ Object(use_header_bar : 1); this.stream_interactor = s; this.account = a; + Util.force_error_color(change_password_error_label); cancel_button.clicked.connect(() => { close(); }); current_passwd_entry.changed.connect(on_current_passwd_entry_changed); new_passwd_entry.changed.connect(on_new_passwd_entry_changed); confirm_new_passwd_entry.changed.connect(on_confirm_new_passwd_entry_changed); - ok_button.clicked.connect(on_ok_button_clicked); + change_password_button.clicked.connect(on_change_password_button_clicked); } private void are_psswd_nonempty(){ - if (current_passwd_entry.get_text_length() > 0 && new_passwd_entry.get_text_length() > 0 && confirm_new_passwd_entry.get_text_length() > 0){ + EntryBuffer newpsswd = new_passwd_entry.get_buffer(); + EntryBuffer confirm_newpsswd = confirm_new_passwd_entry.get_buffer(); + + if (current_passwd_entry.get_text_length() > 0 + && new_passwd_entry.get_text_length() > 0 + && confirm_new_passwd_entry.get_text_length() > 0 + && newpsswd.get_text() == confirm_newpsswd.get_text()){ are_forms_empty = false; - ok_button.sensitive = true; + change_password_button.sensitive = true; } else { are_forms_empty = true; - ok_button.sensitive = false; + change_password_button.sensitive = false; } } @@ -46,8 +56,10 @@ namespace Dino.Ui{ if (newpsswd.get_text() != confirm_newpsswd.get_text()){ new_passwd_entry.add_css_class("error"); + confirm_new_passwd_entry.add_css_class("error"); } else { new_passwd_entry.remove_css_class("error"); + confirm_new_passwd_entry.remove_css_class("error"); } } @@ -65,12 +77,23 @@ namespace Dino.Ui{ check_new_passwd(); } - private async void on_ok_button_clicked(){ + private async void on_change_password_button_clicked(){ string? pw_input = current_passwd_entry.get_buffer().get_text(); string? new_pw_input = new_passwd_entry.get_buffer().get_text(); - if(pw_input != null && account.password == pw_input){ - stream_interactor.get_module(Register.IDENTITY).change_password.begin(account, new_pw_input); -// close(); + + if (pw_input != null && account.password == pw_input){ + change_password_button.sensitive = false; + change_password_stack.visible_child_name = "spinner"; + string ret = yield stream_interactor.get_module(Register.IDENTITY).change_password(account, new_pw_input); + change_password_button.sensitive = true; + change_password_stack.visible_child_name = "label"; + if (ret == null) + close(); + + change_password_error_label.label = ret; + + } else { + change_password_error_label.label = _("Wrong password"); } } } diff --git a/xmpp-vala/src/module/xep/0077_in_band_registration.vala b/xmpp-vala/src/module/xep/0077_in_band_registration.vala index 89a31c3c..ecb25334 100644 --- a/xmpp-vala/src/module/xep/0077_in_band_registration.vala +++ b/xmpp-vala/src/module/xep/0077_in_band_registration.vala @@ -30,28 +30,23 @@ public class Module : XmppStreamNegotiationModule { return null; } - public async void change_password(XmppStream stream, Jid jid, string new_pw) { - StanzaNode pw_change_node = new StanzaNode.build("query",NS_URI).add_self_xmlns(); - StanzaNode username_node = new StanzaNode.build("username"); - StanzaNode pw_node = new StanzaNode.build("password"); + public async string? change_password(XmppStream stream, Jid jid, string new_pw) { + StanzaNode pw_change_node = new StanzaNode.build("query", NS_URI).add_self_xmlns(); + StanzaNode username_node = new StanzaNode.build("username", NS_URI); + StanzaNode pw_node = new StanzaNode.build("password", NS_URI); username_node.put_node(new StanzaNode.text(jid.localpart)); pw_node.put_node(new StanzaNode.text(new_pw)); pw_change_node.put_node(username_node); pw_change_node.put_node(pw_node); - //pw_change_node.put_node(new StanzaNode.build()); -// StanzaNode execute_chpw = new StanzaNode.build("command","http://jabber.org/protocol/commands").add_self_xmlns(); -// execute_chpw.put_attribute("node","passwd"); -// execute_chpw.put_attribute("action","execute"); - Iq.Stanza set_password_iq = new Iq.Stanza.set(pw_change_node, "changepwtest") { to=jid.bare_jid.domain_jid }; + Iq.Stanza set_password_iq = new Iq.Stanza.set(pw_change_node, "change1") { to=jid.bare_jid.domain_jid }; -// Iq.Stanza set_password_iq = new Iq.Stanza.set(execute_chpw) { to=jid.bare_jid.domain_jid }; Iq.Stanza chpw_result = yield stream.get_module(Iq.Module.IDENTITY).send_iq_async(stream, set_password_iq); if (chpw_result.is_error()) { ErrorStanza? error_stanza = chpw_result.get_error(); - stderr.printf("\n" + error_stanza.text ?? "Error when trying to change password \n"); + return error_stanza.text ?? "Error"; } -// StanzaNode changepw_node = new StanzaNode.build("query", NS_URI).add_self_xmlns(); + return null; } public override bool mandatory_outstanding(XmppStream stream) { return false; } From 734e1503c75a8ee784d712b8ed4f2271835de7f1 Mon Sep 17 00:00:00 2001 From: emil Date: Wed, 18 May 2022 15:45:21 +0200 Subject: [PATCH 3/6] Remove Gst.deinit (proactive bug fix) Gst.deinit caused the Dino proces to linger in the background when I tried using Gst in the phone ringer plugin. My reasoning for leaving it out even though Gst is not in use anymore in the ringer plugin is that this is a nasty bug that might crop up again in the future when someone tries to do anything else at all with Gst. I did the following things: - checked this https://gstreamer.freedesktop.org/documentation/gstreamer/gst.html#gst_deinit - tested that Dino works without the Gst.deinit - tried looking for a specific reason for the deinit with git log -L 276,+10 -- plugins/rtp/src/plugin.vala I didn't find anything so this made me conclude that it is better to leave it out. --- plugins/rtp/src/plugin.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/rtp/src/plugin.vala b/plugins/rtp/src/plugin.vala index 98b9717d..b0699aad 100644 --- a/plugins/rtp/src/plugin.vala +++ b/plugins/rtp/src/plugin.vala @@ -276,7 +276,6 @@ public class Dino.Plugins.Rtp.Plugin : RootInterface, VideoCallPlugin, Object { device_monitor.stop(); } destroy_call_pipe(); - Gst.deinit(); } public bool supports(string? media) { From a3958949f0ceec4eacb6df31253f1763f8c9d25b Mon Sep 17 00:00:00 2001 From: emil Date: Sun, 6 Nov 2022 15:27:53 +0100 Subject: [PATCH 4/6] Phone ringing and dialing --- CMakeLists.txt | 2 +- libdino/src/service/notification_events.vala | 91 ++++++++++++------- main/src/ui/notifier_freedesktop.vala | 4 +- main/src/ui/notifier_gnotifications.vala | 3 + plugins/phone-ringer/CMakeLists.txt | 28 ++++++ plugins/phone-ringer/src/plugin.vala | 83 +++++++++++++++++ plugins/phone-ringer/src/register_plugin.vala | 3 + 7 files changed, 180 insertions(+), 34 deletions(-) create mode 100644 plugins/phone-ringer/CMakeLists.txt create mode 100644 plugins/phone-ringer/src/plugin.vala create mode 100644 plugins/phone-ringer/src/register_plugin.vala diff --git a/CMakeLists.txt b/CMakeLists.txt index 1365b6d2..66b32f4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ else () endif () # Prepare Plugins -set(DEFAULT_PLUGINS omemo;openpgp;http-files;ice;rtp) +set(DEFAULT_PLUGINS omemo;openpgp;http-files;ice;rtp;phone-ringer) foreach (plugin ${DEFAULT_PLUGINS}) if ("$CACHE{DINO_PLUGIN_ENABLED_${plugin}}" STREQUAL "") if (NOT DEFINED DINO_PLUGIN_ENABLED_${plugin}}) diff --git a/libdino/src/service/notification_events.vala b/libdino/src/service/notification_events.vala index 8771b5a9..f448a7ad 100644 --- a/libdino/src/service/notification_events.vala +++ b/libdino/src/service/notification_events.vala @@ -12,9 +12,7 @@ public class NotificationEvents : StreamInteractionModule, Object { public signal void notify_content_item(ContentItem content_item, Conversation conversation); private StreamInteractor stream_interactor; - private Future notifier; - private Promise notifier_promise; - private bool notifier_outstanding = true; + private Gee.List> promises = new ArrayList>(); public static void start(StreamInteractor stream_interactor) { NotificationEvents m = new NotificationEvents(stream_interactor); @@ -31,18 +29,16 @@ public class NotificationEvents : StreamInteractionModule, Object { stream_interactor.get_module(MucManager.IDENTITY).voice_request_received.connect((account, room_jid, from_jid, nick) => on_voice_request_received.begin(account, room_jid, from_jid, nick)); stream_interactor.get_module(Calls.IDENTITY).call_incoming.connect((call, state, conversation, video, multiparty) => on_call_incoming.begin(call, state, conversation, video, multiparty)); + stream_interactor.get_module(Calls.IDENTITY).call_outgoing.connect((call, state, conversation) => on_call_outgoing.begin(call)); + stream_interactor.connection_manager.connection_error.connect((account, error) => on_connection_error.begin(account, error)); stream_interactor.get_module(ChatInteraction.IDENTITY).focused_in.connect((conversation) => on_focused_in.begin(conversation)); - - notifier_promise = new Promise(); - notifier = notifier_promise.future; } public async void register_notification_provider(NotificationProvider notification_provider) { - if (notifier_outstanding || (yield notifier.wait_async()).get_priority() < notification_provider.get_priority()) { - notifier_outstanding = false; - notifier_promise.set_value(notification_provider); - } + var promise = new Promise(); + promise.set_value(notification_provider); + promises.add(promise); } private async void on_content_item_received(ContentItem item, Conversation conversation) { @@ -77,8 +73,10 @@ public class NotificationEvents : StreamInteractionModule, Object { notify_content_item(item, conversation); if (notify != Conversation.NotifySetting.OFF) { - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_message(message, conversation, conversation_display_name, participant_display_name); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_message(message, conversation, conversation_display_name, participant_display_name); + } } break; case FileItem.TYPE: @@ -91,8 +89,10 @@ public class NotificationEvents : StreamInteractionModule, Object { notify_content_item(item, conversation); if (notify != Conversation.NotifySetting.OFF) { - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_file(file_transfer, conversation, is_image, conversation_display_name, participant_display_name); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_file(file_transfer, conversation, is_image, conversation_display_name, participant_display_name); + } } break; case CallItem.TYPE: @@ -105,29 +105,47 @@ public class NotificationEvents : StreamInteractionModule, Object { Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(room_jid, account, Conversation.Type.GROUPCHAT); if (conversation == null) return; - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_voice_request(conversation, from_jid); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_voice_request(conversation, from_jid); + } } private async void on_received_subscription_request(Jid jid, Account account) { Conversation conversation = stream_interactor.get_module(ConversationManager.IDENTITY).create_conversation(jid, account, Conversation.Type.CHAT); if (stream_interactor.get_module(ChatInteraction.IDENTITY).is_active_focus(conversation)) return; - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_subscription_request(conversation); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_subscription_request(conversation); + } } private async void on_call_incoming(Call call, CallState call_state, Conversation conversation, bool video, bool multiparty) { if (!stream_interactor.get_module(Calls.IDENTITY).can_we_do_calls(call.account)) return; string conversation_display_name = get_conversation_display_name(stream_interactor, conversation, null); - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_call(call, conversation, video, multiparty, conversation_display_name); - call.notify["state"].connect(() => { - if (call.state != Call.State.RINGING) { - notifier.retract_call_notification.begin(call, conversation); - } - }); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_call(call, conversation, video, multiparty, conversation_display_name); + call.notify["state"].connect(() => { + if (call.state != Call.State.RINGING) { + notifier.retract_call_notification.begin(call, conversation); + } + }); + } + } + + private async void on_call_outgoing(Call call) { + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_dialing(); + call.notify["state"].connect(() => { + if (call.state != Call.State.ESTABLISHING) { + notifier.retract_dialing.begin(); + } + }); + } } private async void on_invite_received(Account account, Jid room_jid, Jid from_jid, string? password, string? reason) { @@ -139,19 +157,26 @@ public class NotificationEvents : StreamInteractionModule, Object { Conversation direct_conversation = new Conversation(from_jid, account, Conversation.Type.CHAT); inviter_display_name = get_participant_display_name(stream_interactor, direct_conversation, from_jid); } - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_muc_invite(account, room_jid, from_jid, inviter_display_name); + + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_muc_invite(account, room_jid, from_jid, inviter_display_name); + } } private async void on_connection_error(Account account, ConnectionManager.ConnectionError error) { - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.notify_connection_error(account, error); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.notify_connection_error(account, error); + } } private async void on_focused_in(Conversation conversation) { - NotificationProvider notifier = yield notifier.wait_async(); - yield notifier.retract_content_item_notifications(); - yield notifier.retract_conversation_notifications(conversation); + foreach(var promise in promises) { + NotificationProvider notifier = yield promise.future.wait_async(); + yield notifier.retract_content_item_notifications(); + yield notifier.retract_conversation_notifications(conversation); + } } } @@ -162,6 +187,8 @@ public interface NotificationProvider : Object { public abstract async void notify_file(FileTransfer file_transfer, Conversation conversation, bool is_image, string conversation_display_name, string? participant_display_name); public abstract async void notify_call(Call call, Conversation conversation, bool video, bool multiparty, string conversation_display_name); public abstract async void retract_call_notification(Call call, Conversation conversation); + public abstract async void notify_dialing(); + public abstract async void retract_dialing(); public abstract async void notify_subscription_request(Conversation conversation); public abstract async void notify_connection_error(Account account, ConnectionManager.ConnectionError error); public abstract async void notify_muc_invite(Account account, Jid room_jid, Jid from_jid, string inviter_display_name); diff --git a/main/src/ui/notifier_freedesktop.vala b/main/src/ui/notifier_freedesktop.vala index a1df5990..79b07744 100644 --- a/main/src/ui/notifier_freedesktop.vala +++ b/main/src/ui/notifier_freedesktop.vala @@ -118,7 +118,6 @@ public class Dino.Ui.FreeDesktopNotifier : NotificationProvider, Object { HashTable hash_table = new HashTable(null, null); hash_table["image-path"] = "call-start-symbolic"; - hash_table["sound-name"] = new Variant.string("phone-incoming-call"); hash_table["urgency"] = new Variant.byte(2); hash_table["desktop-entry"] = new Variant.string(Dino.Application.get_default().get_application_id()); hash_table["category"] = new Variant.string("im"); @@ -153,6 +152,9 @@ public class Dino.Ui.FreeDesktopNotifier : NotificationProvider, Object { } catch (Error e) { } } + public async void notify_dialing(){} + public async void retract_dialing(){} + public async void notify_subscription_request(Conversation conversation) { string summary = _("Subscription request"); string body = Markup.escape_text(conversation.counterpart.to_string()); diff --git a/main/src/ui/notifier_gnotifications.vala b/main/src/ui/notifier_gnotifications.vala index 4d36620d..83df1868 100644 --- a/main/src/ui/notifier_gnotifications.vala +++ b/main/src/ui/notifier_gnotifications.vala @@ -87,6 +87,9 @@ namespace Dino.Ui { GLib.Application.get_default().withdraw_notification(call.id.to_string()); } + public async void notify_dialing(){} + public async void retract_dialing(){} + public async void notify_subscription_request(Conversation conversation) { Notification notification = new Notification(_("Subscription request")); notification.set_body(conversation.counterpart.to_string()); diff --git a/plugins/phone-ringer/CMakeLists.txt b/plugins/phone-ringer/CMakeLists.txt new file mode 100644 index 00000000..58f77499 --- /dev/null +++ b/plugins/phone-ringer/CMakeLists.txt @@ -0,0 +1,28 @@ +find_packages(PHONE_RINGER_PACKAGES REQUIRED + Canberra + Gee + GLib + GModule + GObject + GDKPixbuf2 +) + +vala_precompile(PHONE_RINGER_VALA_C +SOURCES + src/plugin.vala + src/register_plugin.vala +CUSTOM_VAPIS + ${CMAKE_BINARY_DIR}/exports/xmpp-vala.vapi + ${CMAKE_BINARY_DIR}/exports/dino.vapi + ${CMAKE_BINARY_DIR}/exports/qlite.vapi +PACKAGES + ${PHONE_RINGER_PACKAGES} +) + +add_definitions(${VALA_CFLAGS}) +add_library(phone-ringer SHARED ${PHONE_RINGER_VALA_C}) +target_link_libraries(phone-ringer libdino ${PHONE_RINGER_PACKAGES}) +set_target_properties(phone-ringer PROPERTIES PREFIX "") +set_target_properties(phone-ringer PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugins/) + +install(TARGETS phone-ringer ${PLUGIN_INSTALL}) diff --git a/plugins/phone-ringer/src/plugin.vala b/plugins/phone-ringer/src/plugin.vala new file mode 100644 index 00000000..e2e2c04d --- /dev/null +++ b/plugins/phone-ringer/src/plugin.vala @@ -0,0 +1,83 @@ +using Dino.Entities; +using Xmpp; + +namespace Dino.Plugins.PhoneRinger { + +public class Plugin : RootInterface, NotificationProvider, Object { + + private Canberra.Context sound_context; + private const int ringer_id = 0; + private const int dialer_id = 1; + private Canberra.Proplist ringer_props; + private Canberra.Proplist dialer_props; + + private void loop_ringer() { + sound_context.play_full(ringer_id, ringer_props, (c, id, code) => { + if (code != Canberra.Error.CANCELED) { + Idle.add(() => { + loop_ringer(); + return Source.REMOVE; + }); + } + }); + } + + private void loop_dialer() { + sound_context.play_full(dialer_id, dialer_props, (c, id, code) => { + if (code != Canberra.Error.CANCELED) { + Idle.add(() => { + loop_dialer(); + return Source.REMOVE; + }); + } + }); + } + + public void registered(Dino.Application app) { + + Canberra.Context.create(out sound_context); + Canberra.Proplist.create(out ringer_props); + Canberra.Proplist.create(out dialer_props); + ringer_props.sets(Canberra.PROP_EVENT_ID, "phone-incoming-call"); + ringer_props.sets(Canberra.PROP_EVENT_DESCRIPTION, "Incoming call"); + dialer_props.sets(Canberra.PROP_EVENT_ID, "phone-outgoing-calling"); + dialer_props.sets(Canberra.PROP_EVENT_DESCRIPTION, "Outgoing call"); + + NotificationEvents notification_events = app.stream_interactor.get_module(NotificationEvents.IDENTITY); + notification_events.register_notification_provider.begin(this); + } + + public void shutdown() { } + + public async void notify_call(Call call, Conversation conversation, bool video, bool multiparty, string conversation_display_name){ + loop_ringer(); + } + + public async void retract_call_notification(Call call, Conversation conversation){ + sound_context.cancel(ringer_id); + } + + public async void notify_dialing(){ + loop_dialer(); + } + + public async void retract_dialing(){ + sound_context.cancel(dialer_id); + } + + public double get_priority(){ + return 0; + } + + public async void notify_message(Message message, Conversation conversation, string conversation_display_name, string? participant_display_name){} + public async void notify_file(FileTransfer file_transfer, Conversation conversation, bool is_image, string conversation_display_name, string? participant_display_name){} + public async void notify_subscription_request(Conversation conversation){} + public async void notify_connection_error(Account account, ConnectionManager.ConnectionError error){} + public async void notify_muc_invite(Account account, Jid room_jid, Jid from_jid, string inviter_display_name){} + public async void notify_voice_request(Conversation conversation, Jid from_jid){} + public async void retract_content_item_notifications(){} + public async void retract_conversation_notifications(Conversation conversation){} + +} + +} diff --git a/plugins/phone-ringer/src/register_plugin.vala b/plugins/phone-ringer/src/register_plugin.vala new file mode 100644 index 00000000..9008ea75 --- /dev/null +++ b/plugins/phone-ringer/src/register_plugin.vala @@ -0,0 +1,3 @@ +public Type register_plugin(Module module) { + return typeof (Dino.Plugins.PhoneRinger.Plugin); +} From 735e6f544a9841b694c4aafbb3ef0b1df1db4d9b Mon Sep 17 00:00:00 2001 From: emil Date: Thu, 19 May 2022 05:53:57 +0200 Subject: [PATCH 5/6] Add gap to ringing and dialing sounds --- plugins/phone-ringer/src/plugin.vala | 43 ++++++++++++++++------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/plugins/phone-ringer/src/plugin.vala b/plugins/phone-ringer/src/plugin.vala index e2e2c04d..9e2e6af9 100644 --- a/plugins/phone-ringer/src/plugin.vala +++ b/plugins/phone-ringer/src/plugin.vala @@ -5,31 +5,34 @@ namespace Dino.Plugins.PhoneRinger { public class Plugin : RootInterface, NotificationProvider, Object { + private const int GAP = 1; + private const int RINGER_ID = 0; + private const int DIALER_ID = 1; private Canberra.Context sound_context; - private const int ringer_id = 0; - private const int dialer_id = 1; private Canberra.Proplist ringer_props; private Canberra.Proplist dialer_props; + private bool ringing = false; + private bool dialing = false; private void loop_ringer() { - sound_context.play_full(ringer_id, ringer_props, (c, id, code) => { - if (code != Canberra.Error.CANCELED) { - Idle.add(() => { - loop_ringer(); - return Source.REMOVE; - }); - } + sound_context.play_full(RINGER_ID, ringer_props, (c, id, code) => { + if (code == Canberra.Error.CANCELED) return; + Timeout.add_seconds(GAP, () => { + if (!ringing) return Source.REMOVE; + loop_ringer(); + return Source.REMOVE; + }); }); } private void loop_dialer() { - sound_context.play_full(dialer_id, dialer_props, (c, id, code) => { - if (code != Canberra.Error.CANCELED) { - Idle.add(() => { - loop_dialer(); - return Source.REMOVE; - }); - } + sound_context.play_full(DIALER_ID, dialer_props, (c, id, code) => { + if (code == Canberra.Error.CANCELED) return; + Timeout.add_seconds(GAP, () => { + if (!dialing) return Source.REMOVE; + loop_dialer(); + return Source.REMOVE; + }); }); } @@ -50,19 +53,23 @@ public class Plugin : RootInterface, NotificationProvider, Object { public void shutdown() { } public async void notify_call(Call call, Conversation conversation, bool video, bool multiparty, string conversation_display_name){ + ringing = true; loop_ringer(); } public async void retract_call_notification(Call call, Conversation conversation){ - sound_context.cancel(ringer_id); + ringing = false; + sound_context.cancel(RINGER_ID); } public async void notify_dialing(){ + dialing = true; loop_dialer(); } public async void retract_dialing(){ - sound_context.cancel(dialer_id); + dialing = false; + sound_context.cancel(DIALER_ID); } public double get_priority(){ From 1a9c55ecc9ab72c76fc6fc7c4f8eef0ce5494d2b Mon Sep 17 00:00:00 2001 From: Konstantin Kuznetsov Date: Tue, 12 Mar 2024 11:30:39 +0300 Subject: [PATCH 6/6] Add button to fetch MAM history for conversation --- libdino/src/service/history_sync.vala | 25 +++++++++ main/CMakeLists.txt | 1 + main/meson.build | 1 + .../ui/contact_details/history_provider.vala | 52 +++++++++++++++++++ main/src/ui/conversation_details.vala | 1 + 5 files changed, 80 insertions(+) create mode 100644 main/src/ui/contact_details/history_provider.vala diff --git a/libdino/src/service/history_sync.vala b/libdino/src/service/history_sync.vala index 8ab6d7bb..eb24c7e2 100644 --- a/libdino/src/service/history_sync.vala +++ b/libdino/src/service/history_sync.vala @@ -120,6 +120,31 @@ public class Dino.HistorySync { } } + public async void fetch_history(Account account, Jid target, Cancellable? cancellable = null) { + debug("Fetch history for %s", target.to_string()); + + RowOption latest_row_opt = db.mam_catchup.select() + .with(db.mam_catchup.account_id, "=", account.id) + .with(db.mam_catchup.server_jid, "=", target.to_string()) + .with(db.mam_catchup.to_time, ">=", (long) new DateTime.from_unix_utc(0).to_unix()) + .order_by(db.mam_catchup.to_time, "DESC") + .single().row(); + Row? latest_row = latest_row_opt.is_present() ? latest_row_opt.inner : null; + + if (latest_row == null) { + warning("Failed to fetch history for %s, no mam catchup data", target.to_string()); + return; + } + + DateTime latest_time = new DateTime.now(); + string latest_id = latest_row[db.mam_catchup.from_id]; + + Xmpp.MessageArchiveManagement.V2.MamQueryParams query_params; + query_params = new Xmpp.MessageArchiveManagement.V2.MamQueryParams.query_before(target, latest_time, latest_id); + + yield fetch_query(account, query_params, latest_row[db.mam_catchup.id], cancellable); + } + public async void fetch_everything(Account account, Jid mam_server, Cancellable? cancellable = null, DateTime until_earliest_time = new DateTime.from_unix_utc(0)) { debug("Fetch everything for %s %s", mam_server.to_string(), until_earliest_time != null ? @"(until $until_earliest_time)" : ""); RowOption latest_row_opt = db.mam_catchup.select() diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 13988c87..3a24eb0c 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -204,6 +204,7 @@ SOURCES src/ui/contact_details/settings_provider.vala src/ui/contact_details/permissions_provider.vala + src/ui/contact_details/history_provider.vala src/ui/conversation_details.vala diff --git a/main/meson.build b/main/meson.build index ee17404c..69069f64 100644 --- a/main/meson.build +++ b/main/meson.build @@ -39,6 +39,7 @@ sources = files( 'src/ui/chat_input/view.vala', 'src/ui/contact_details/permissions_provider.vala', 'src/ui/contact_details/settings_provider.vala', + 'src/ui/contact_details/history_provider.vala', 'src/ui/conversation_content_view/call_widget.vala', 'src/ui/conversation_content_view/chat_state_populator.vala', 'src/ui/conversation_content_view/content_populator.vala', diff --git a/main/src/ui/contact_details/history_provider.vala b/main/src/ui/contact_details/history_provider.vala new file mode 100644 index 00000000..558ce3fd --- /dev/null +++ b/main/src/ui/contact_details/history_provider.vala @@ -0,0 +1,52 @@ +using Gee; +using Gtk; + +using Dino.Entities; + +using Xmpp; + +namespace Dino.Ui.ContactDetails { + +public class HistoryProvider : Plugins.ContactDetailsProvider, Object { + public string id { get { return "history_settings"; } } + + private StreamInteractor stream_interactor; + + private HashMap> sync_cancellables = new HashMap>(Account.hash_func, Account.equals_func); + + public HistoryProvider(StreamInteractor stream_interactor) { + this.stream_interactor = stream_interactor; + } + + public void populate(Conversation conversation, Plugins.ContactDetails contact_details, Plugins.WidgetType type) { + if (type != Plugins.WidgetType.GTK4) return; + + EntityInfo entity_info = stream_interactor.get_module(EntityInfo.IDENTITY); + + string RESYNC_LABEL = _("Resync"); + string RESYNC_DESC_LABEL = _("Fetch a complete MAM history for this chat"); + entity_info.has_feature.begin(conversation.account, conversation.counterpart, Xmpp.MessageArchiveManagement.NS_URI, (_, res) => { + bool can_do_mam = entity_info.has_feature.end(res); + if (can_do_mam) { + Button resync_button = new Button.with_label(RESYNC_LABEL); + contact_details.add("Permissions", RESYNC_DESC_LABEL, "", resync_button); + resync_button.clicked.connect(() => { + if (!sync_cancellables.has_key(conversation.account)) { + sync_cancellables[conversation.account] = new HashMap(); + } + + if (!sync_cancellables[conversation.account].has_key(conversation.counterpart.bare_jid)) { + sync_cancellables[conversation.account][conversation.counterpart.bare_jid] = new Cancellable(); + var history_sync = stream_interactor.get_module(MessageProcessor.IDENTITY).history_sync; + history_sync.fetch_history.begin(conversation.account, conversation.counterpart.bare_jid, sync_cancellables[conversation.account][conversation.counterpart.bare_jid], (_, res) => { + history_sync.fetch_everything.end(res); + sync_cancellables[conversation.account].unset(conversation.counterpart.bare_jid); + }); + } + }); + } + }); + } +} + +} \ No newline at end of file diff --git a/main/src/ui/conversation_details.vala b/main/src/ui/conversation_details.vala index 82d6ae54..a7942d4f 100644 --- a/main/src/ui/conversation_details.vala +++ b/main/src/ui/conversation_details.vala @@ -152,6 +152,7 @@ namespace Dino.Ui.ConversationDetails { Application app = GLib.Application.get_default() as Application; app.plugin_registry.register_contact_details_entry(new ContactDetails.SettingsProvider(stream_interactor)); app.plugin_registry.register_contact_details_entry(new ContactDetails.PermissionsProvider(stream_interactor)); + app.plugin_registry.register_contact_details_entry(new ContactDetails.HistoryProvider(stream_interactor)); foreach (Plugins.ContactDetailsProvider provider in app.plugin_registry.contact_details_entries) { provider.populate(conversation, contact_details, Plugins.WidgetType.GTK4);