Compare commits
19 commits
fix-flatpa
...
master
Author | SHA1 | Date | |
---|---|---|---|
91e743572c | |||
80af06709f | |||
c28d3865bc | |||
c0299480ad | |||
e55207c46e | |||
036d17df97 | |||
1555bd7a12 | |||
a554bb1a92 | |||
3f54c42aaf | |||
7e57a373d8 | |||
edd0249b20 | |||
78cc398e30 | |||
f66604560b | |||
a7c58bc2a8 | |||
c00d3a1e15 | |||
5bca23615f | |||
d6173ba850 | |||
5784530204 | |||
cdabee7f20 |
|
@ -81,6 +81,8 @@ macro(set_path what val desc)
|
|||
endif()
|
||||
endmacro(set_path)
|
||||
|
||||
set(LOCALEDIR_NAME "share/locale")
|
||||
|
||||
string(REGEX REPLACE "^liblib" "lib" LIBDIR_NAME "lib${LIB_SUFFIX}")
|
||||
set_path(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Installation directory for architecture-independent files")
|
||||
set_path(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" "Installation directory for architecture-dependent files")
|
||||
|
@ -94,7 +96,7 @@ set_path(SERVICE_FILE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/dbus-1/services" "Ins
|
|||
set_path(ICON_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/icons" "Installation directory for icons")
|
||||
set_path(INCLUDE_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/include" "Installation directory for C header files")
|
||||
set_path(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/${LIBDIR_NAME}" "Installation directory for object code libraries")
|
||||
set_path(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" "Installation directory for locale files")
|
||||
set_path(LOCALE_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/${LOCALEDIR_NAME}" "Installation directory for locale files")
|
||||
set_path(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/dino/plugins" "Installation directory for dino plugin object code files")
|
||||
set_path(VAPI_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/vala/vapi" "Installation directory for Vala API files")
|
||||
|
||||
|
|
18
README.md
18
README.md
|
@ -32,16 +32,18 @@ OS support
|
|||
------------
|
||||
* Linux (flatpaks are targeted for Ubuntu 22.04+)
|
||||
* Windows 10\11
|
||||
* MacOS via [brew](https://brew.sh/) (very experimental!)
|
||||
* MacOS via [brew](https://brew.sh/) (very experimental, see below)
|
||||
|
||||
We only support 64 bit platforms.
|
||||
Officially, we support only x86_64 architecture. Whilst you may be able to compile this code for ARM-based platforms (like Pinephone or MacOS), there's zero guarantees that it'll compile or function properly, as we don't have the hardware and the time to test it out.
|
||||
|
||||
Installation (prebuilt packages)
|
||||
Installation (prebuilt packages & AUR)
|
||||
------------
|
||||
Have a look at our [releases](https://github.com/mxlgv/dino/releases).
|
||||
|
||||
Windows installer is self-explanatory, and will place a shortcut on your desktop. Ignore the possible warning from Windows Defender: it's caused by the fact that installer does not have a digital signature.
|
||||
|
||||
Deb package is built and tested only for Ubuntu 22.04, but it may work on its derivatives as well, such as Pop!_OS or Linux Mint.
|
||||
|
||||
Flatpak is not present in Flathub yet, but you can install it manually. The commands below assume that you have "flatpak" package of your distro installed in your system. If it is not, please refer to https://flatpak.org/setup/
|
||||
|
||||
1) Download the .flatpak file from [releases](https://github.com/mxlgv/dino/releases)
|
||||
|
@ -49,7 +51,7 @@ Flatpak is not present in Flathub yet, but you can install it manually. The comm
|
|||
```
|
||||
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||||
```
|
||||
3) Change the directory to the one you've downloaded the .flatpak to and run:
|
||||
3) Change the directory to the one you've downloaded the .flatpak to and run (you may have to change the file name in this command):
|
||||
```
|
||||
flatpak install ./im.dino.Dino.flatpak
|
||||
```
|
||||
|
@ -64,14 +66,18 @@ Flatpak is not present in Flathub yet, but you can install it manually. The comm
|
|||
|
||||
Flatpak distribution is confirmed to be working on Arch Testing, Manjaro Stable, Void Linux and Linux Mint.
|
||||
|
||||
Arch Linux & Manjaro users may install `dino-plus-git` package from [AUR](https://aur.archlinux.org/packages/dino-plus-git) via any helper of their choice.
|
||||
|
||||
Build on Linux
|
||||
-----
|
||||
Make sure to install all [dependencies](https://github.com/dino/dino/wiki/Build#dependencies).
|
||||
|
||||
./configure
|
||||
./configure --release --no-debug --with-tests --enable-plugin=notification-sound --prefix=/usr
|
||||
make
|
||||
build/dino
|
||||
|
||||
Additionally, you might need to install `gst-plugins-bad` and `webrtc-audio-processing` packages (or however they might be called in your distro), if you want to have noise cancelling and gain control. If you don't want that or your distro don't have that package, add "--without-webrtc" (without quotes) to the first command.
|
||||
|
||||
If you want to use `meson` build system, follow the next instructions:
|
||||
|
||||
meson setup build
|
||||
|
@ -91,8 +97,6 @@ If there is no `webrtcdsp` plugin in your system (check this by calling `gst-ins
|
|||
* `-Dplugin-rtp-webrtc-audio-processing=disabled` for `meson`;
|
||||
* `-DPLUGIN_RTP_WEBRTC_AUDIO_PROCESSING=OFF` for `cmake`.
|
||||
|
||||
In addition, there is a git version of this package for **Arch Linux** on [AUR](https://aur.archlinux.org/packages/dino-plus-git)
|
||||
|
||||
Build on Windows (x86_64)
|
||||
------------
|
||||
- Install and configure the [MSYS2](https://www.msys2.org/) package;
|
||||
|
|
|
@ -21,13 +21,13 @@ fatal()
|
|||
|
||||
download_yolort()
|
||||
{
|
||||
file_name=cppwinrt-2.0.210122.3+windows-10.0.19041+yolort-835cd4e.zip
|
||||
file_name=yolort.zip
|
||||
yolort_dir="$PROJ_DIR/plugins/windows-notification/yolort"
|
||||
|
||||
rm -rf "$yolort_dir"
|
||||
mkdir "$yolort_dir"
|
||||
curl -L -o "$file_name" "https://github.com/LAGonauta/YoloRT/releases/download/v1.0.0/$file_name"
|
||||
echo "675a6d943c97b4acdbfaa473f68d3241d1798b31a67b5529c8d29fc0176a1707 $file_name" | sha256sum --check --status
|
||||
curl -L -o "$file_name" "https://github.com/mxlgv/YoloRT/releases/download/dev1/$file_name"
|
||||
echo "c2727e390da7e842f66e0a4cf0a9f5d9dfb665115bb554152d98f108d322bbc1 $file_name" | sha256sum --check --status
|
||||
unzip -o "$file_name" -d "$yolort_dir"
|
||||
rm -f "$file_name"
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "im.dino.Dino",
|
||||
"runtime": "org.gnome.Platform",
|
||||
"runtime-version": "44",
|
||||
"runtime-version": "46",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"command": "dino",
|
||||
"finish-args": [
|
||||
|
@ -60,7 +60,11 @@
|
|||
"buildsystem": "cmake-ninja",
|
||||
"builddir": true,
|
||||
"config-opts": [
|
||||
"-DSOUP_VERSION=3"
|
||||
"-DSOUP_VERSION=3",
|
||||
"-DNO_DEBUG=yes",
|
||||
"-DCMAKE_BUILD_TYPE=Release",
|
||||
"-DENABLED_PLUGINS=notification-sound",
|
||||
"-DPLUGIN_RTP_WEBRTC_AUDIO_PROCESSING=OFF"
|
||||
],
|
||||
"cleanup": [
|
||||
"/include",
|
||||
|
|
|
@ -102,7 +102,8 @@ DEPENDS
|
|||
${CMAKE_BINARY_DIR}/exports/dino_i18n.h
|
||||
)
|
||||
|
||||
add_definitions(${VALA_CFLAGS} -DDINO_SYSTEM_PLUGIN_DIR="${PLUGIN_INSTALL_DIR}" -DDINO_SYSTEM_LIBDIR_NAME="${LIBDIR_NAME}" -DG_LOG_DOMAIN="libdino" -DDINO_VERSION=\"${PROJECT_VERSION}\")
|
||||
add_definitions(${VALA_CFLAGS} -DDINO_SYSTEM_PLUGIN_DIR="${PLUGIN_INSTALL_DIR}" -DDINO_SYSTEM_LIBDIR_NAME="${LIBDIR_NAME}" -DG_LOG_DOMAIN="libdino"
|
||||
-DDINO_VERSION=\"${PROJECT_VERSION}\" -DDINO_SYSTEM_LOCALEDIR_NAME="${LOCALEDIR_NAME}")
|
||||
add_library(libdino SHARED ${LIBDINO_VALA_C} ${CMAKE_BINARY_DIR}/exports/dino_i18n.h)
|
||||
add_dependencies(libdino dino-vapi)
|
||||
target_link_libraries(libdino xmpp-vala qlite ${LIBDINO_PACKAGES} m)
|
||||
|
|
|
@ -80,6 +80,7 @@ sources = files(
|
|||
sources += [version_vala]
|
||||
c_args = [
|
||||
'-DDINO_SYSTEM_LIBDIR_NAME="@0@"'.format(get_option('libdir')),
|
||||
'-DDINO_SYSTEM_LOCALEDIR_NAME="@0@"'.format(get_option('localedir')),
|
||||
'-DDINO_SYSTEM_PLUGIN_DIR="@0@"'.format(get_option('prefix') / get_option('libdir') / get_option('plugindir')),
|
||||
'-DG_LOG_DOMAIN="libdino"',
|
||||
]
|
||||
|
|
|
@ -25,13 +25,13 @@ public interface Application : GLib.Application {
|
|||
|
||||
public abstract void handle_uri(string jid, string query, Gee.Map<string, string> options);
|
||||
|
||||
public void init() throws Error {
|
||||
public void init(bool default_dark_theme) throws Error {
|
||||
if (DirUtils.create_with_parents(get_storage_dir(), 0700) == -1) {
|
||||
throw new Error(-1, 0, "Could not create storage dir \"%s\": %s", get_storage_dir(), FileUtils.error_from_errno(errno).to_string());
|
||||
}
|
||||
|
||||
this.db = new Database(Path.build_filename(get_storage_dir(), "dino.db"));
|
||||
this.settings = new Dino.Entities.Settings.from_db(db);
|
||||
this.settings = new Dino.Entities.Settings.from_db(db, default_dark_theme);
|
||||
this.stream_interactor = new StreamInteractor(db);
|
||||
|
||||
MessageProcessor.start(stream_interactor, db);
|
||||
|
|
|
@ -4,7 +4,7 @@ public class Settings : Object {
|
|||
|
||||
private Database db;
|
||||
|
||||
public Settings.from_db(Database db) {
|
||||
public Settings.from_db(Database db, bool default_dark_theme) {
|
||||
this.db = db;
|
||||
|
||||
send_typing_ = col_to_bool_or_default("send_typing", true);
|
||||
|
@ -15,7 +15,7 @@ public class Settings : Object {
|
|||
default_encryption = col_to_encryption_or_default("default_encryption", Encryption.UNKNOWN);
|
||||
send_button = col_to_bool_or_default("send_button", false);
|
||||
enter_newline = col_to_bool_or_default("enter_newline", false);
|
||||
dark_theme = col_to_bool_or_default("dark_theme", false);
|
||||
dark_theme = col_to_bool_or_default("dark_theme", default_dark_theme);
|
||||
}
|
||||
|
||||
private bool col_to_bool_or_default(string key, bool def) {
|
||||
|
|
|
@ -46,6 +46,15 @@ public class FileManager : StreamInteractionModule, Object {
|
|||
return ret;
|
||||
}
|
||||
|
||||
private string sanitize_filename(string filename) {
|
||||
#if _WIN32
|
||||
GLib.Regex regex = new GLib.Regex("[<>:\"/\\|?*]");
|
||||
#else
|
||||
GLib.Regex regex = new GLib.Regex("[/]");
|
||||
#endif
|
||||
return regex.replace(filename, -1, 0, "_");
|
||||
}
|
||||
|
||||
public async void send_file(File file, Conversation conversation) {
|
||||
FileTransfer file_transfer = new FileTransfer();
|
||||
file_transfer.account = conversation.account;
|
||||
|
@ -243,7 +252,7 @@ public class FileManager : StreamInteractionModule, Object {
|
|||
}
|
||||
|
||||
// Save file
|
||||
string filename = Random.next_int().to_string("%x") + "_" + file_transfer.file_name;
|
||||
string filename = Random.next_int().to_string("%x") + "_" + sanitize_filename(file_transfer.file_name);
|
||||
File file = File.new_for_path(Path.build_filename(get_storage_dir(), filename));
|
||||
|
||||
OutputStream os = file.create(FileCreateFlags.REPLACE_DESTINATION);
|
||||
|
@ -332,7 +341,7 @@ public class FileManager : StreamInteractionModule, Object {
|
|||
|
||||
private async void save_file(FileTransfer file_transfer) throws FileSendError {
|
||||
try {
|
||||
string filename = Random.next_int().to_string("%x") + "_" + file_transfer.file_name;
|
||||
string filename = Random.next_int().to_string("%x") + "_" + sanitize_filename(file_transfer.file_name);
|
||||
File file = File.new_for_path(Path.build_filename(get_storage_dir(), filename));
|
||||
OutputStream os = file.create(FileCreateFlags.REPLACE_DESTINATION);
|
||||
yield os.splice_async(file_transfer.input_stream, OutputStreamSpliceFlags.CLOSE_SOURCE|OutputStreamSpliceFlags.CLOSE_TARGET);
|
||||
|
|
|
@ -6,7 +6,7 @@ namespace Dino {
|
|||
public class Util {
|
||||
#if _WIN32
|
||||
[CCode (cname = "ShellExecuteA", cheader_filename = "windows.h")]
|
||||
private static extern int ShellExecuteA(int* hwnd, string operation, string file, string parameters, string directory, int showCmd);
|
||||
private static extern int* ShellExecuteA(int* hwnd, string operation, string file, string parameters, string directory, int showCmd);
|
||||
|
||||
[CCode (cname = "CoInitialize", cheader_filename = "windows.h")]
|
||||
private static extern int CoInitialize(void* reserved);
|
||||
|
@ -14,7 +14,7 @@ public class Util {
|
|||
[CCode (cname = "CoUninitialize", cheader_filename = "windows.h")]
|
||||
private static extern void CoUninitialize();
|
||||
|
||||
private static int ShellExecute(string operation, string file) {
|
||||
private static int* ShellExecute(string operation, string file) {
|
||||
CoInitialize(null);
|
||||
var result = ShellExecuteA(null, operation, file, null, null, 1);
|
||||
CoUninitialize();
|
||||
|
|
|
@ -2,6 +2,7 @@ namespace Dino {
|
|||
|
||||
private extern const string SYSTEM_LIBDIR_NAME;
|
||||
private extern const string SYSTEM_PLUGIN_DIR;
|
||||
private extern const string SYSTEM_LOCALEDIR_NAME;
|
||||
|
||||
public class SearchPathGenerator {
|
||||
|
||||
|
@ -12,14 +13,21 @@ public class SearchPathGenerator {
|
|||
}
|
||||
|
||||
public string get_locale_path(string gettext_package, string locale_install_dir) {
|
||||
string? locale_dir = null;
|
||||
if (Path.get_dirname(exec_path).contains("dino") || Path.get_dirname(exec_path) == "." || Path.get_dirname(exec_path).contains("build")) {
|
||||
string exec_locale = Path.build_filename(Path.get_dirname(exec_path), "locale");
|
||||
if (FileUtils.test(Path.build_filename(exec_locale, "en", "LC_MESSAGES", gettext_package + ".mo"), FileTest.IS_REGULAR)) {
|
||||
locale_dir = exec_locale;
|
||||
if (exec_path != null) {
|
||||
var exec_dir = Path.get_dirname(exec_path);
|
||||
string[] search_paths = new string[] {
|
||||
Path.build_filename(exec_dir, "locale"),
|
||||
Path.build_filename(Path.get_dirname(exec_dir), SYSTEM_LOCALEDIR_NAME)
|
||||
};
|
||||
foreach (var path in search_paths) {
|
||||
if (FileUtils.test(Path.build_filename(path, "en", "LC_MESSAGES", gettext_package + ".mo"), FileTest.IS_REGULAR)) {
|
||||
debug(@"Found locale $(gettext_package).mo in $(path)");
|
||||
return path;
|
||||
}
|
||||
}
|
||||
return locale_dir ?? locale_install_dir;
|
||||
}
|
||||
|
||||
return locale_install_dir;
|
||||
}
|
||||
|
||||
public string[] get_plugin_paths() {
|
||||
|
|
|
@ -145,7 +145,6 @@
|
|||
<child>
|
||||
<object class="AdwActionRow">
|
||||
<property name="title" translatable="yes">_Dark theme</property>
|
||||
<property name="subtitle" translatable="yes">If disabled, use system settings</property>
|
||||
<property name="use-underline">True</property>
|
||||
<property name="activatable-widget">dark_theme</property>
|
||||
<child type="suffix">
|
||||
|
|
|
@ -1054,10 +1054,6 @@ msgstr ""
|
|||
msgid "_Dark theme"
|
||||
msgstr ""
|
||||
|
||||
#: main/data/settings_dialog.ui:148
|
||||
msgid "If disabled, use system settings"
|
||||
msgstr ""
|
||||
|
||||
#: main/data/im.dino.Dino.appdata.xml.in:7
|
||||
msgid "Modern XMPP Chat Client"
|
||||
msgstr ""
|
||||
|
|
|
@ -563,7 +563,7 @@ msgstr "Уведомления"
|
|||
|
||||
#: main/src/ui/contact_details/settings_provider.vala:55
|
||||
msgid "Pin conversation"
|
||||
msgstr ""
|
||||
msgstr "Закрепить беседу"
|
||||
|
||||
#: main/src/ui/contact_details/settings_provider.vala:55
|
||||
msgid "Pins the conversation to the top of the conversation list"
|
||||
|
@ -826,16 +826,16 @@ msgstr "Прочтите %s, чтобы узнать о процессе авт
|
|||
|
||||
#: main/src/ui/conversation_content_view/message_widget.vala:213
|
||||
msgid "Edit message"
|
||||
msgstr ""
|
||||
msgstr "Редактировать сообщение"
|
||||
|
||||
#: main/src/ui/conversation_content_view/reactions_widget.vala:102
|
||||
msgid "You"
|
||||
msgstr ""
|
||||
msgstr "Вы"
|
||||
|
||||
#: main/src/ui/conversation_content_view/reactions_widget.vala:128
|
||||
#: main/src/ui/conversation_content_view/item_actions.vala:8
|
||||
msgid "Add reaction"
|
||||
msgstr ""
|
||||
msgstr "Добавить реакцию"
|
||||
|
||||
#: main/src/ui/conversation_content_view/file_image_widget.vala:53
|
||||
#: main/src/ui/conversation_content_view/file_default_widget.vala:57
|
||||
|
@ -947,7 +947,7 @@ msgstr "несколько секунд"
|
|||
|
||||
#: main/src/ui/conversation_content_view/conversation_item_skeleton.vala:191
|
||||
msgid "Delivered"
|
||||
msgstr ""
|
||||
msgstr "Доставленo"
|
||||
|
||||
#: main/src/ui/conversation_content_view/conversation_item_skeleton.vala:195
|
||||
msgid "Read"
|
||||
|
@ -959,15 +959,15 @@ msgstr "Этот контакт хочет добавить вас в свой
|
|||
|
||||
#: main/src/ui/conversation_content_view/item_actions.vala:21
|
||||
msgid "This conversation does not support reactions."
|
||||
msgstr ""
|
||||
msgstr "Этот разговор не поддерживает реакции."
|
||||
|
||||
#: main/src/ui/conversation_content_view/item_actions.vala:33
|
||||
msgid "Reply"
|
||||
msgstr ""
|
||||
msgstr "Ответить"
|
||||
|
||||
#: main/src/ui/conversation_content_view/item_actions.vala:43
|
||||
msgid "This conversation does not support replies."
|
||||
msgstr ""
|
||||
msgstr "Этот разговор не поддерживает ответы"
|
||||
|
||||
#: main/src/ui/conversation_content_view/file_default_widget.vala:64
|
||||
#, c-format
|
||||
|
@ -1006,7 +1006,7 @@ msgstr "Тут пустовато"
|
|||
|
||||
#: main/data/unified_main_content.ui:47
|
||||
msgid "Click + to start a chat or join a channel"
|
||||
msgstr ""
|
||||
msgstr "Нажмите +, чтобы начать чат или присоединиться к каналу"
|
||||
|
||||
#: main/data/add_conversation/conference_details_fragment.ui:20
|
||||
#: main/data/add_conversation/add_groupchat_dialog.ui:40
|
||||
|
@ -1072,10 +1072,6 @@ msgstr "Если опция недоступна, используйте Shift+E
|
|||
msgid "_Dark theme"
|
||||
msgstr "Тёмная тема"
|
||||
|
||||
#: main/data/settings_dialog.ui:148
|
||||
msgid "If disabled, use system settings"
|
||||
msgstr "Если опция недоступна, используйте настройки системы"
|
||||
|
||||
#: main/data/im.dino.Dino.appdata.xml.in:7
|
||||
msgid "Modern XMPP Chat Client"
|
||||
msgstr "Современный XMPP клиент"
|
||||
|
|
|
@ -29,7 +29,10 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application {
|
|||
|
||||
public Application() throws Error {
|
||||
Object(application_id: "im.dino.Dino", flags: ApplicationFlags.HANDLES_OPEN);
|
||||
init();
|
||||
|
||||
var style_manager = Adw.StyleManager.get_default();
|
||||
bool system_dark_theme = style_manager.system_supports_color_schemes && style_manager.dark;
|
||||
init(system_dark_theme);
|
||||
Environment.set_application_name("Dino");
|
||||
Window.set_default_icon_name("im.dino.Dino");
|
||||
|
||||
|
@ -73,9 +76,9 @@ public class Dino.Ui.Application : Adw.Application, Dino.Application {
|
|||
var manager = Adw.StyleManager.get_default();
|
||||
if (is_dark != manager.dark) {
|
||||
if (is_dark) {
|
||||
manager.set_color_scheme(Adw.ColorScheme.PREFER_DARK);
|
||||
manager.set_color_scheme(Adw.ColorScheme.FORCE_DARK);
|
||||
} else {
|
||||
manager.set_color_scheme(Adw.ColorScheme.PREFER_LIGHT);
|
||||
manager.set_color_scheme(Adw.ColorScheme.FORCE_LIGHT);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -73,6 +73,9 @@ public class FileImageWidget : Box {
|
|||
image_overlay_toolbar.visible = false;
|
||||
});
|
||||
|
||||
// Set tooltip to display the file name on hover
|
||||
image.set_tooltip_text(file_name);
|
||||
|
||||
this.append(overlay);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,7 +90,8 @@ public class FileWidget : SizeRequestBox {
|
|||
|
||||
private async void update_widget() {
|
||||
if (show_image() && state != State.IMAGE
|
||||
&& file_transfer.state == FileTransfer.State.COMPLETE) {
|
||||
&& file_transfer.state == FileTransfer.State.COMPLETE
|
||||
&& file_transfer.get_file().query_exists()) {
|
||||
var content_bak = content;
|
||||
|
||||
FileImageWidget file_image_widget = null;
|
||||
|
@ -109,7 +110,8 @@ public class FileWidget : SizeRequestBox {
|
|||
} catch (Error e) { }
|
||||
}
|
||||
|
||||
if (state != State.DEFAULT) {
|
||||
if (state != State.DEFAULT ||
|
||||
(file_transfer.state == FileTransfer.State.COMPLETE && !file_transfer.get_file().query_exists())) {
|
||||
if (content != null) this.remove(content);
|
||||
FileDefaultWidget default_file_widget = new FileDefaultWidget();
|
||||
default_widget_controller = new FileDefaultWidgetController(default_file_widget);
|
||||
|
@ -176,11 +178,17 @@ public class FileWidgetController : Object {
|
|||
}
|
||||
|
||||
private void open_file() {
|
||||
if (file_transfer.get_file().query_exists()) {
|
||||
try {
|
||||
Dino.Util.launch_default_for_uri(file_transfer.get_file().get_uri());
|
||||
} catch (Error err) {
|
||||
warning("Failed to open %s - %s", file_transfer.get_file().get_uri(), err.message);
|
||||
}
|
||||
} else {
|
||||
warning("File %s does not exist", file_transfer.get_file().get_uri());
|
||||
file_transfer.state = FileTransfer.State.NOT_STARTED;
|
||||
widget.activate_action("file.download", null);
|
||||
}
|
||||
}
|
||||
|
||||
private void save_file() {
|
||||
|
@ -244,8 +252,12 @@ public class FileDefaultWidgetController : Object {
|
|||
|
||||
private void update_file_info() {
|
||||
state = file_transfer.state;
|
||||
if (state == FileTransfer.State.COMPLETE && !file_transfer.get_file().query_exists()) {
|
||||
state = FileTransfer.State.NOT_STARTED;
|
||||
file_transfer.state = FileTransfer.State.NOT_STARTED;
|
||||
}
|
||||
widget.update_file_info(file_transfer.mime_type, file_transfer.transferred_bytes,
|
||||
file_transfer.direction, file_transfer.state, file_transfer.size);
|
||||
file_transfer.direction, state, file_transfer.size);
|
||||
}
|
||||
|
||||
private void on_clicked() {
|
||||
|
@ -254,10 +266,11 @@ public class FileDefaultWidgetController : Object {
|
|||
widget.activate_action("file.open", null);
|
||||
break;
|
||||
case FileTransfer.State.NOT_STARTED:
|
||||
case FileTransfer.State.FAILED:
|
||||
widget.activate_action("file.download", null);
|
||||
break;
|
||||
default:
|
||||
// Clicking doesn't do anything in FAILED and IN_PROGRESS states
|
||||
// Clicking doesn't do anything in IN_PROGRESS state
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -197,6 +197,7 @@ public class Dialog : Gtk.Dialog {
|
|||
}
|
||||
|
||||
private void populate_grid_data(Account account) {
|
||||
active_switch.sensitive = false;
|
||||
active_switch.state_set.disconnect(change_account_state);
|
||||
|
||||
picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).add_participant(new Conversation(account.bare_jid, account, Conversation.Type.CHAT), account.bare_jid);
|
||||
|
@ -227,11 +228,14 @@ public class Dialog : Gtk.Dialog {
|
|||
ConnectionManager.ConnectionState state = stream_interactor.connection_manager.get_state(account);
|
||||
switch (state) {
|
||||
case ConnectionManager.ConnectionState.CONNECTING:
|
||||
active_switch.sensitive = false;
|
||||
state_label.label = _("Connecting…"); break;
|
||||
case ConnectionManager.ConnectionState.CONNECTED:
|
||||
active_switch.sensitive = true;
|
||||
password_change_btn.sensitive = true;
|
||||
state_label.label = _("Connected"); break;
|
||||
case ConnectionManager.ConnectionState.DISCONNECTED:
|
||||
active_switch.sensitive = true;
|
||||
password_change_btn.sensitive = false;
|
||||
state_label.label = _("Disconnected"); break;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@ class SettingsDialog : Adw.PreferencesWindow {
|
|||
enter_newline_switch.active = settings.enter_newline;
|
||||
enter_newline_switch.sensitive = settings.send_button;
|
||||
dark_theme.active = settings.dark_theme;
|
||||
dark_theme.sensitive = !Adw.StyleManager.get_default().system_supports_color_schemes;
|
||||
|
||||
typing_switch.notify["active"].connect(() => { settings.send_typing = typing_switch.active; } );
|
||||
marker_switch.notify["active"].connect(() => { settings.send_marker = marker_switch.active; } );
|
||||
|
|
|
@ -6,6 +6,21 @@ using Xmpp.Xep;
|
|||
private extern const size_t NICE_ADDRESS_STRING_LEN;
|
||||
|
||||
public class Dino.Plugins.Ice.Plugin : RootInterface, Object {
|
||||
private const int64 delay_min = 300; // 10mn
|
||||
private const int64 delay_max = (int64) uint.MAX;
|
||||
|
||||
private class TimerPayload {
|
||||
public Account account { get; set; }
|
||||
public uint timeout_handle_id;
|
||||
|
||||
public TimerPayload(Account account, uint timeout_handle_id) {
|
||||
this.account = account;
|
||||
this.timeout_handle_id = timeout_handle_id;
|
||||
}
|
||||
}
|
||||
|
||||
private HashMap<XmppStream, TimerPayload> timeouts = new HashMap<XmppStream, TimerPayload>(XmppStream.hash_func, XmppStream.equals_func);
|
||||
|
||||
public Dino.Application app;
|
||||
|
||||
public void registered(Dino.Application app) {
|
||||
|
@ -22,10 +37,10 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object {
|
|||
stream.get_module(JingleRawUdp.Module.IDENTITY).set_local_ip_address_handler(get_local_ip_addresses);
|
||||
}
|
||||
});
|
||||
app.stream_interactor.stream_negotiated.connect(on_stream_negotiated);
|
||||
app.stream_interactor.connection_manager.connection_state_changed.connect(on_connection_state_changed);
|
||||
}
|
||||
|
||||
private async void on_stream_negotiated(Account account, XmppStream stream) {
|
||||
private async void external_discovery_refresh_services(Account account, XmppStream stream) {
|
||||
Module? ice_udp_module = stream.get_module(JingleIceUdp.Module.IDENTITY) as Module;
|
||||
if (ice_udp_module == null) return;
|
||||
Gee.List<Xep.ExternalServiceDiscovery.Service> services = yield ExternalServiceDiscovery.request_services(stream);
|
||||
|
@ -45,6 +60,28 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ice_udp_module.turn_service != null) {
|
||||
DateTime? expires = ice_udp_module.turn_service.expires;
|
||||
if (expires != null) {
|
||||
int64 delay = (expires.to_unix() - new DateTime.now_utc().to_unix()) / 2;
|
||||
|
||||
if (delay >= delay_min && delay <= delay_max) {
|
||||
debug("Next server external service discovery in %lds (because of TURN credentials' expiry time)", (long) delay);
|
||||
|
||||
uint timeout_handle_id = Timeout.add_seconds((uint) delay, () => {
|
||||
on_timeout(stream);
|
||||
return false;
|
||||
});
|
||||
timeouts[stream] = new TimerPayload(account, timeout_handle_id);
|
||||
timeouts[stream].account = account;
|
||||
timeouts[stream].timeout_handle_id = timeout_handle_id;
|
||||
} else {
|
||||
warning("Bogus TURN credentials' expiry time (delay value = %ld), *not* planning next service discovery", (long) delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ice_udp_module.stun_ip == null) {
|
||||
InetAddress ip = yield lookup_ipv4_addess("stun.dino.im");
|
||||
if (ip == null) return;
|
||||
|
@ -56,6 +93,31 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object {
|
|||
}
|
||||
}
|
||||
|
||||
public void on_timeout(XmppStream stream) {
|
||||
if (!timeouts.has_key(stream)) return;
|
||||
TimerPayload pl = timeouts[stream];
|
||||
timeouts.unset(stream);
|
||||
external_discovery_refresh_services.begin(pl.account, stream);
|
||||
}
|
||||
|
||||
public void on_connection_state_changed(Account account, ConnectionManager.ConnectionState state) {
|
||||
switch(state)
|
||||
{
|
||||
case ConnectionManager.ConnectionState.DISCONNECTED:
|
||||
XmppStream? stream = app.stream_interactor.connection_manager.get_stream(account);
|
||||
if (stream == null) return;
|
||||
if (!timeouts.has_key(stream)) return;
|
||||
|
||||
Source.remove(timeouts[stream].timeout_handle_id);
|
||||
timeouts.unset(stream);
|
||||
break;
|
||||
case ConnectionManager.ConnectionState.CONNECTED:
|
||||
XmppStream? stream = app.stream_interactor.connection_manager.get_stream(account);
|
||||
external_discovery_refresh_services(account, stream);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void shutdown() {
|
||||
// Nothing to do
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dino-openpgp-0.0\n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-02-07 21:31+0100\n"
|
||||
"PO-Revision-Date: 2020-04-16 20:11+0000\n"
|
||||
"POT-Creation-Date: 2024-06-09 22:16+0200\n"
|
||||
"PO-Revision-Date: 2024-06-09 22:39+0200\n"
|
||||
"Last-Translator: eerielili \n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/dino/plugin-"
|
||||
"openpgp/de/>\n"
|
||||
"Language: de\n"
|
||||
|
@ -11,11 +12,11 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.0.1-dev\n"
|
||||
"X-Generator: Poedit 3.4.2\n"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:68
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Key publishing disabled"
|
||||
msgstr "Schlüsselveröffentlichung deaktiviert"
|
||||
|
||||
|
@ -24,18 +25,40 @@ msgid "Error in GnuPG"
|
|||
msgstr "Fehler in GnuPG"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
msgid "No keys available. Generate one!"
|
||||
msgstr "Keine Schlüssel vorhanden. Erzeuge einen!"
|
||||
msgid ""
|
||||
"No keys available. Generate one or check if your keys aren't expired or "
|
||||
"revoked!"
|
||||
msgstr ""
|
||||
"Keine Schlüssel vorhanden. Erstellen Sie einen oder prüfen Sie,"
|
||||
"ob Ihre Schlüssel nicht abgelaufen sind oder widerrufen!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "expired!"
|
||||
msgstr "abgelaufen"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "revoked!"
|
||||
msgstr "widerrufen!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
msgid "Attention required!"
|
||||
msgstr "Achtung!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
#, c-format
|
||||
msgid "Your key %s is %s"
|
||||
msgstr "Ihr Schlüssel %s is %s"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Select key"
|
||||
msgstr "Wähle einen Schlüssel"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Loading…"
|
||||
msgstr "Lade…"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Querying GnuPG"
|
||||
msgstr "Frage GnuPG ab"
|
||||
|
||||
|
@ -46,6 +69,3 @@ msgstr "Schlüssel nicht im Schlüsselbund"
|
|||
#: plugins/openpgp/src/contact_details_provider.vala:30
|
||||
msgid "Encryption"
|
||||
msgstr "Verschlüsselung"
|
||||
|
||||
#~ msgid "OpenPGP"
|
||||
#~ msgstr "OpenPGP"
|
||||
|
|
|
@ -1,52 +1,68 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-02-07 21:31+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"Project-Id-Version: PACKAGE VERSION+\n"
|
||||
"POT-Creation-Date: 2024-06-09 22:16+0200\n"
|
||||
"PO-Revision-Date: 2024-06-09 22:18+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Dino+\n"
|
||||
"Language: en\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.4.2\n"
|
||||
"X-Poedit-Basepath: ../src\n"
|
||||
"X-Poedit-KeywordsList: _(\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"X-Poedit-SearchPath-0: .\n"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:68
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: account_settings_entry.vala:68 account_settings_entry.vala:72
|
||||
#: account_settings_entry.vala:113
|
||||
msgid "Key publishing disabled"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:68
|
||||
#: account_settings_entry.vala:68
|
||||
msgid "Error in GnuPG"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
msgid "No keys available. Generate one!"
|
||||
#: account_settings_entry.vala:72
|
||||
msgid ""
|
||||
"No keys available. Generate one or check if your keys aren't expired or "
|
||||
"revoked!"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: account_settings_entry.vala:95
|
||||
msgid "expired!"
|
||||
msgstr ""
|
||||
|
||||
#: account_settings_entry.vala:95
|
||||
msgid "revoked!"
|
||||
msgstr ""
|
||||
|
||||
#: account_settings_entry.vala:96
|
||||
msgid "Attention required!"
|
||||
msgstr ""
|
||||
|
||||
#: account_settings_entry.vala:96
|
||||
#, c-format
|
||||
msgid "Your key %s is %s"
|
||||
msgstr ""
|
||||
|
||||
#: account_settings_entry.vala:113
|
||||
msgid "Select key"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: account_settings_entry.vala:126
|
||||
msgid "Loading…"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: account_settings_entry.vala:126
|
||||
msgid "Querying GnuPG"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/contact_details_provider.vala:28
|
||||
#: contact_details_provider.vala:28
|
||||
msgid "Key not in keychain"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/openpgp/src/contact_details_provider.vala:30
|
||||
#: contact_details_provider.vala:30
|
||||
msgid "Encryption"
|
||||
msgstr ""
|
||||
|
|
|
@ -7,8 +7,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-02-07 21:31+0100\n"
|
||||
"PO-Revision-Date: 2020-11-12 17:21+0000\n"
|
||||
"POT-Creation-Date: 2024-06-09 22:16+0200\n"
|
||||
"PO-Revision-Date: 2024-06-09 22:22+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/dino/plugin-"
|
||||
"openpgp/fr/>\n"
|
||||
"Language: fr\n"
|
||||
|
@ -16,11 +17,11 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.4-dev\n"
|
||||
"X-Generator: Poedit 3.4.2\n"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:68
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Key publishing disabled"
|
||||
msgstr "La publication des clés est désactivée"
|
||||
|
||||
|
@ -29,18 +30,39 @@ msgid "Error in GnuPG"
|
|||
msgstr "Erreur dans GnuPG"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
msgid "No keys available. Generate one!"
|
||||
msgstr "Aucune clé n’est disponible. Générez-en une !"
|
||||
msgid ""
|
||||
"No keys available. Generate one or check if your keys aren't expired or "
|
||||
"revoked!"
|
||||
msgstr ""
|
||||
"Pas de clés disponibles. Générez-en une nouvelle ou vérifier si vos "
|
||||
"clés ne seraient pas expirées ou révoquées!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "expired!"
|
||||
msgstr "expirée!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "revoked!"
|
||||
msgstr "révoquée!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
msgid "Attention required!"
|
||||
msgstr "Attention requise!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
#, c-format
|
||||
msgid "Your key %s is %s"
|
||||
msgstr "Votre clé %s est %s"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Select key"
|
||||
msgstr "Choix d’une clé"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Loading…"
|
||||
msgstr "Chargement…"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Querying GnuPG"
|
||||
msgstr "Interrogation de GnuPG"
|
||||
|
||||
|
|
|
@ -7,8 +7,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-02-07 21:31+0100\n"
|
||||
"PO-Revision-Date: 2020-06-02 11:41+0000\n"
|
||||
"POT-Creation-Date: 2024-06-09 22:16+0200\n"
|
||||
"PO-Revision-Date: 2024-06-09 22:39+0200\n"
|
||||
"Last-Translator: eerielili\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/dino/plugin-"
|
||||
"openpgp/ru/>\n"
|
||||
"Language: ru\n"
|
||||
|
@ -17,11 +18,11 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.1-dev\n"
|
||||
"X-Generator: Poedit 3.4.2\n"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:68
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Key publishing disabled"
|
||||
msgstr "Публикация ключа отключена"
|
||||
|
||||
|
@ -30,18 +31,37 @@ msgid "Error in GnuPG"
|
|||
msgstr "Ошибка в GnuPG"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:72
|
||||
msgid "No keys available. Generate one!"
|
||||
msgid ""
|
||||
"No keys available. Generate one or check if your keys aren't expired or "
|
||||
"revoked!"
|
||||
msgstr "Нет доступных ключей. Создайте как минимум один, либо проверьте что уже существующие (ранее созданные) ключи не были отозваны или срок их действия не закончился!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:101
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "expired!"
|
||||
msgstr "истёк!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:95
|
||||
msgid "revoked!"
|
||||
msgstr "отозван!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
msgid "Attention required!"
|
||||
msgstr "внимание!"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:96
|
||||
#, c-format
|
||||
msgid "Your key %s is %s"
|
||||
msgstr "Ваш ключ %s %s"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:113
|
||||
msgid "Select key"
|
||||
msgstr "Выбрать ключ"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Loading…"
|
||||
msgstr "Загрузка…"
|
||||
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:114
|
||||
#: plugins/openpgp/src/account_settings_entry.vala:126
|
||||
msgid "Querying GnuPG"
|
||||
msgstr "Запрос GnuPG"
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ public class AccountSettingsEntry : Plugins.AccountSettingsEntry {
|
|||
return;
|
||||
}
|
||||
if (keys.size == 0) {
|
||||
label.set_markup(build_markup_string(_("Key publishing disabled"), _("No keys available. Generate one!")));
|
||||
label.set_markup(build_markup_string(_("Key publishing disabled"), _("No keys available. Generate one or check if your keys aren't expired or revoked!")));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -88,6 +88,18 @@ public class AccountSettingsEntry : Plugins.AccountSettingsEntry {
|
|||
set_label_active(selected);
|
||||
|
||||
combobox.changed.connect(key_changed);
|
||||
if (account_key != null) {
|
||||
try {
|
||||
GPG.Key key_check = GPGHelper.get_public_key(account_key);
|
||||
if(key_check.expired || key_check.revoked) {
|
||||
string status_str = key_check.expired ? _("expired!") : _("revoked!");
|
||||
label.set_markup(build_markup_string(_("Attention required!"), _("Your key %s is %s").printf("<span color='red'><b>"+ key_check.fpr +"</b></span>", status_str) ) );
|
||||
}
|
||||
}
|
||||
catch {
|
||||
debug("Coudn't check GPG key status.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void populate_list_store() {
|
||||
|
|
|
@ -191,4 +191,12 @@ public abstract class Xmpp.XmppStream : Object {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool equals_func(XmppStream str1, XmppStream str2) {
|
||||
return str1.remote_name.to_string() == str2.remote_name.to_string();
|
||||
}
|
||||
|
||||
public static uint hash_func(XmppStream str) {
|
||||
return str.remote_name.to_string().hash();
|
||||
}
|
||||
}
|
|
@ -25,6 +25,9 @@ namespace Xmpp.Xep.ExternalServiceDiscovery {
|
|||
|
||||
service.username = service_node.get_attribute("username", NS_URI);
|
||||
service.password = service_node.get_attribute("password", NS_URI);
|
||||
string? expires_str = service_node.get_attribute("expires", NS_URI);
|
||||
if (expires_str != null) service.expires = DateTimeProfiles.parse_string(expires_str);
|
||||
|
||||
service.transport = service_node.get_attribute("transport", NS_URI);
|
||||
service.name = service_node.get_attribute("name", NS_URI);
|
||||
string? restricted_str = service_node.get_attribute("restricted", NS_URI);
|
||||
|
@ -41,6 +44,7 @@ namespace Xmpp.Xep.ExternalServiceDiscovery {
|
|||
|
||||
public string username { get; set; }
|
||||
public string password { get; set; }
|
||||
public DateTime? expires { get; set; }
|
||||
|
||||
public string transport { get; set; }
|
||||
public string name { get; set; }
|
||||
|
|
Loading…
Reference in a new issue